CARBON 2020-05-18
查找子字符串
查找字符 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。运算符 说明 举例
! 非运算,表达式为 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