Shell脚本
- 一、脚本的建立和运行
- 二、Shell程序的参数位置
- 三、基本语法
- 四、常见操作
shell是用户和系统内核交互的程序。我们经常使用的shell是bash。下面简单的复习一下bash脚本的使用。
一、脚本的建立和运行
bash脚本常见的有两种运行方式:一种是输入命令让bash交互的执行它们,另一种就是将命令写入到文件中,然后将文件作为程序来调用。
流程如下:
1.创建shell脚本 2.赋予文件可执行权限(chomd +x shell.sh
) 3.运行程序(./shell.sh
)
二、Shell程序的参数位置
位置参数:
位置参数是由系统提供的参数。可以用$N来表示,N是一个数字。$0
表示脚本文件的名字,$1-$9
表示命令行参数1-9的值。另外常用的还有: $*
代表命令行中所有参数,$#
代表命令行参数的个数。
三、基本语法
- 变量
可以分环境变量和用户自定义变量。常见的环境变量如下:
环境变量 | 说明 |
$HOME | 当前用户的主目录 |
$PATH | 以冒号分隔的用来搜索命令的目录列表 |
$IFS | 内部域分割符,用来分割shell读取的输入,一般是空格,制表符和换行符 |
自定义变量
可以不声明变量的类型,这样默认是字符类型。也可以用declare
来声明变量的类型,语法如下:
declare [option] [name[=value]]
其中常用的options选项如下:
options | 说明 |
-a | 声明一个数组 |
-f | 声明一个函数 |
-i | 声明一个整数 |
-r | 声明为只读变量 |
变量的赋值:直接用等号来赋值,注意等号两边没有空格
变量的引用:在变量名前面加上**$**符号就可以得到变量的值
命令替换:利用方式为$(command)或者command用反引号包裹。例子:
echo $(pwd)
echo `pwd`
- 语句
条件语句:给出一个例子,读入一个字符串,如果是目录列出目录下的信息,如果是文件,读出文件的内容
!#/bin/sh
echo "please enter a directory or file name"
read a #读入一个变量a
if [ -d $a ] #注意if后面的表达式,左中括号([)后面和右中括号前面(])要有空格,-d表示是否为目录
then #后面要紧接着then
ls $a
elif [ -f $a ] #-f表示是否是文件
then
cat $a
else
echo "input error"
fi #最后要用fi结尾
条件判断除了用if,还可以test
命令。常见的条件类型有三类:字符串比较,算数比较,与文件有关的测试。
字符串比较 | 结果 |
string1 = string2 | 两个字符串相同则返回真 |
string1 != string2 | 两个字符串不相同则为真 |
-n string | string不为空则为真 |
-z string | string为空则为真 |
算数比较 | 结果 |
exp1 -eq exp2 | 两个表达式相等则结果为真 |
exp1 -gt exp2 | exp1 大于 exp2则为真 |
exp1 -ge exp2 | exp1 大于等于 exp2则为真 |
! exp | 取反 |
文件测试条件 | 说明 |
-d file | file 是目录则为真 |
-f file | file为文件则为真 |
-e file | file存在则为真 |
-s file | 如果文件长度不为0则为真 |
循环语句
常用的就是for语句和while语句,格式如下:
#for语句 遍历
for x [in list]
do
command-list
done
#while语句
while expression
do
command-list
done
四、常见操作
- 字符串截取
#截取一个字符串的子串,常见的操作如下
#从指定位置开始截取
#1)从字符串左边开始计数。用法: ${string:start:length},下标从0开始,截取长度为length的串
str="abcdefg"
echo ${str:0:3} #结果为abc
#2)从字符串右边开始计数。用法: ${string:0-start:length},起始数字为1。截取方向也是从左向右
echo ${str:0-4:3} #结果def
#从指定字符开始截取
#${string#*chars}:从string左边开始截取第一次出现chars字符的右边的串
str="abcadefg"
echo ${str#*a} #结果bcadefg
#${string##*chars}:从string左边开始截取最后一次出现的chars字符的右边的串
echo ${str##*a} #结果defg
#使用%截取自定字符左边的串 ${string%chars*}
str="abcbfg"
echo ${str%b*}#结果abc
echo ${str%%b*}#结果a
2.cut命令
cut 命令是一个选取命令,是按照行来选取指定的信息。常见的用法如下:
cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]
- 第一,字节(bytes),用选项-b
- 第二,字符(characters),用选项-c
- 第三,域(fields),用选项-f
若没有指定文件,可将标准输入作为数据内容
#例子
more 1.txt
abc:defg
abcd:efgh
abcde:fghijk
cut -b 1-2 1.txt #取每行的第1,2个字节。也可以用逗号隔开
#结果
ab
ab
ab
more 2.txt
你好世界
测试数据
cut -c 1-3 2.txt #这里主要用于取到多字节的数据,例如中文 (你和测占了3个字节)
#结果
你
测
#cut默认的分割符为制表符,可以用-d来指定分隔符,配合-f指定提取的域
more /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
#比如要提取用户名,观察文本特征是用冒号来分割的
cat /etc/passwd | cut -d : -f 1
#结果
root
daemon
bin
sys
参考文章:
1.Linux字符截取命令-cut2.Shell字符串截取(非常详细)