本文最后更新于 2021-08-24 11:53:24
Shell
shell解释器
helloworld
1 2
| #!/bin/bash echo 'hello world'
|
shell执行方法
- 方法1:
./shell.sh
- 方法2:
sh shell.sh 或者bash shell.sh
- 方法3:
source shell.sh
shell常见变量
- shell的变量直接使用,例如:
a=15 (等号前后不能有空格),调用变量的话 $a 或者 ${a}
$? 判断上一条命令执行的是否成功
$0 返回脚本的文件名称
$1-$9 返回对应的参数值
$* 返回所有的参数值是什么
$# 返回参数的个数
四则运算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| echo $[12 + 6] echo $((12 + 6))
echo $[12 - 6] echo $((12 - 6))
echo $[12 * 6] echo $((12 * 6))
echo $((12 / 6)) echo $[12 / 6]
echo $((12 % 6)) echo $[12 % 6]
val=`expr $a + $b` echo "a + b : $val"
|
条件判断
文件路径
- -e 目标是否存在(exist)
- -d 是否为路径(directory)
- -f 是否为文件(file)
- -L 判断对象是否存在,并且为符号链接
- -h 判断对象是否存在,并且为软链接
- -O 判断对象是否存在,并且属于当前用户
- -G 判断对象是否存在,并且属于当前用户组
- -nt 判断file1是否比file2新 [ “/data/file1” -nt “/data/file2” ]
- -ot 判断file1是否比file2旧 [ “/data/file1” -ot “/data/file2” ]
- [ -e foer.sh ] || touch foer.sh #判断当前目录下是否有foer.sh这个文件,假如没有就创建出foer.sh文件
- 中括号两边都要空格
权限
- -r 是否有读取权限(read)
- -w 是否有写入权限(write)
- -x 是否有执行权限(excute)
- [ -x 123.txt ] && echo ‘有执行权限’
整数比较
- -eq 等于(equal)
- -ne 不等于(not equal)
- -gt 大于(greater than)
- -lt 小于(lesser than)
- -ge 大于或者等于(greater or equal)
- -le 小于或者等于(lesser or equal)
- [ 9 -gt 8 ] && echo ‘大于’
字符串
- = 相等
- != 不相等
- [ ‘kkkkk’ != ‘kkkk’ ] && echo ‘不等于’
逻辑
example
1 2 3 4 5 6 7 8 9
| #!/bin/bash
if [ $1 -ge $2 ] then echo "$1 大于等于$2" else echo "$1 小于$2" fi
|
单分支判断
1 2 3 4 5 6 7 8 9 10 11
| if [ 条件判断 ]; then 执行动作 fi
if [ 条件判断 ]; then 执行动作 else 执行动作 fi
|
多分支判断
1 2 3 4 5 6 7 8 9 10
| if [ 条件判断 ]; then 执行动作 elif [ 条件判断 ]; then 执行动作 elif [ 条件判断 ]; then 执行动作 fi
|
for循环控制
1 2 3 4 5 6 7 8 9 10 11
|
for i in 1 2 3 4 do echo "$i" sleep 2 done
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
for i in `seq 1 10` do echo "$i" sleep 2 done
for i in $(cat a.txt) do ping -c 2 $i done
|
1 2 3 4 5 6 7 8 9
|
for (( i=1;i<11;i++)) do echo "$i" done
|
case
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| case 变量 in 值1 ) 执行动作1 ;; 值2 ) 执行动作2 ;; 值3 ) 执行动作3 ;; * ) 执行动作4 ;; esac
|
while
1 2 3 4 5 6 7 8 9 10 11 12 13
|
i=0 sum=0 while [ $i -lt $1 ] do sum=$(($sum+$i)) i=$(($i+1)) done echo "sum=$sum"
|
定义函数
不限制定义和调用顺序
1 2 3 4
| function name() { statements [return value] }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #!/bin/bash function getsum(){ local sum=0 for n in $@ do ((sum+=n)) done return $sum } getsum 10 20 55 15 echo $?
total=$(getsum 10 20 55 15) echo $total
echo $(getsum 10 20 55 15)
|
select…in
适合终端(Terminal)这样的交互场景
select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环
运行到 select 语句后,取值列表 value_list 中的内容会以菜单的形式显示出来,用户输入菜单编号,就表示选中了某个值,这个值就会赋给变量 variable,然后再执行循环体中的 statements(do 和 done 之间的部分)。
1 2 3 4
| select variable in value_list do statements done
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #!/bin/bash
echo "What is your favourite OS?" select name in "Linux" "Windows" "Mac OS" "UNIX" "Android" do case $name in "Linux") echo "Linux是一个类UNIX操作系统,它开源免费,运行在各种服务器设备和嵌入式设备。" break ;; "Windows") echo "Windows是微软开发的个人电脑操作系统,它是闭源收费的。" break ;; "Mac OS") echo "Mac OS是苹果公司基于UNIX开发的一款图形界面操作系统,只能运行与苹果提供的硬件之上。" break ;; "UNIX") echo "UNIX是操作系统的开山鼻祖,现在已经逐渐退出历史舞台,只应用在特殊场合。" break ;; "Android") echo "Android是由Google开发的手机操作系统,目前已经占据了70%的市场份额。" break ;; *) echo "输入错误,请重新输入" esac done
|
管道
1
| echo "ls head | awk -F\" \" 'NR==$random_head{print \$0}'"|bash
|
随机
$RANDOM
1
| random_head=`expr $RANDOM % $headimgs_count + 1`
|
变量
1 2 3 4 5 6 7 8 9
| #定义变量 pi=3.14 #获取到值 echo $pi #导出变量 #导出的变量会共享给调用的脚本 #共享模式为拷贝副本,在后面的子脚本中,修改的只是副本的值 export age=10
|
数组
1 2 3 4 5 6 7 8 9 10 11 12 13
| my_array=(A B "C" D) echo "数组的元素为: ${my_array[*]}" echo "数组的元素为: ${my_array[@]}" echo "数组元素个数为: ${#my_array[*]}" echo "数组元素个数为: ${#my_array[@]}"
array_name[0]=value0 array_name[1]=value1 array_name[2]=value2 echo "第一个元素为: ${my_array[0]}" echo "第二个元素为: ${my_array[1]}" echo "第三个元素为: ${my_array[2]}" echo "第四个元素为: ${my_array[3]}"
|