Shell编程
第一个shell脚本
编写sh脚本
#!/bin/bash
echo "Hello World !"
执行
1)作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。其他二进制文件也一样。
2)作为解释器参数
/bin/sh test.sh
Shell 变量
定义:
your_name="runoob.com"
• 注意:
1)变量名和等号之间不能有空格;
2)命名只能使用英文字母,数字和下划线,首个字符不能以数字开头;
3)不能使用bash里的关键字(可用help命令查看保留关键字)。
使用:
只要在变量名前面加美元符号即可
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
只读变量: readonly
删除变量: unset
Shell 字符串
单引号字符串的限制:
• 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
• 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号的优点:
• 双引号里可以有变量
• 双引号里可以出现转义字符
拼接字符串
获取字符串长度
string="abcd"
echo ${#string} #输出 4
提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
注意:第一个字符的索引值为 0。
查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo expr index "$string" io
# 输出 4
注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。
Shell 数组(仅支持一维数组)
定义数组
数组名=(值1 值2 ... 值n) my_array=(A B "C" D)
读取数组
${数组名[下标]} 使用 @ 符号可以获取数组中的所有元素:echo ${array_name[@]} echo "第一个元素为: ${my_array[0]}"
获取数组的长度
取得数组元素的个数
length=${#array_name[@]} echo "数组的元素为: ${#my_array[@]}"
或者
length=${#array_name[]} echo "数组的元素为: ${#my_array[]}"
取得数组单个元素的长度
lengthn=${#array_name[n]}
获取数组中的所有元素
使用@ 或 可以获取数组中的所有元素
echo "数组的元素为: ${my_array[
]}"
echo "数组的元素为: ${my_array[@]}"
Shell 注释
#
:<<EOF
注释内容...
EOF
:<<'
注释内容...
'
:<<!
注释内容...
!
Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……$0 为执行的文件名
echo "执行的文件名:$0";
echo "第一个参数为:$1";
参数处理 说明
$# 传递到脚本的参数个数
$ 以一个单字符串显示所有向脚本传递的参数。
如"$
"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
Shell 基本运算符
两点注意:
• 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
• 完整的表达式要被
包含,注意这个字符不是常用的单引号,在 Esc 键下边。
• 运算符 说明 举例
- 加法
expr $a + $b
结果为 30。 - 减法
expr $a - $b
结果为 -10。 - 乘法
expr $a \* $b
结果为 200。
/ 除法expr $b / $a
结果为 2。
% 取余expr $b % $a
结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
其他检查符:
• -S: 判断某文件是否 socket。
• -L: 检测文件是否存在并且是一个符号链接。
Shell echo命令
Shell printf 命令
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
序列 说明
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符
Shell test 命令
Shell 流程控制
条件结构:
if condition
then
command1
command2
...
commandN
fi
if condition
then
command1
command2
...
commandN
else
command
fi
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
while condition
do
command
done
while true
do
command
done
until condition
do
command
done
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
来源:oschina
链接:https://my.oschina.net/u/4394131/blog/4283430