简单的 Shell 脚本入门教程 (2)

关系运算符只支持数字,如果字符串为数字也可以,关系运算符包括:

运算符 含义
-eq   等于  
-ne   不等于  
-gt   大于  
-lt   小于  
-ge   大等于  
-le   小等于  

条件表达式必须放在 [] 中,并且 [ 的右侧,和 ] 的左侧必须留有空格

布尔运算符列表:

运算符 含义
!    
-o   或 (or)  
-a   与 (and)  
#!/usr/bin/env bash a="10" b="3" c=1 if [ ${a} -ne ${b} ] then echo "相同" else echo "不相同" fi if [ ${a} -gt ${b} -a ${b} -gt ${c} ] then echo "a > b & b > c" fi

其他常用判断:

直接在 [ ] 中放字符串变量 如 [ ${str} ] 则就是判断 str 这个字符串是否非空

-f 判断是否为普通文件,如:[ -f $file ]

-d 判断是否为文件夹,如:[ -d $file ]

字符串截取

字符截取的格式:${string: start :length}
索引从 0 开始,可以省略 :length 这样就截取到最后,注意空格要空在 : 后,否则可能提示:bad substitution

#!/usr/bin/env bash string="hello world" echo ${string: 1 : 3} # ell # 截取到最后 echo ${string:1} # ello world 数组 #!/usr/bin/env bash # 1. 定义数组:使用括号声明,用“空格”分隔开,也可以换行隔开 arr=(1 2 3) strArr=( "first" "second" ) # 2. 读取数组:通过下标读取,下标从 0 开始计算 echo "${arr[0]}" # 使用 * 或者 @ 读取所有元素 echo ${arr[*]} echo ${arr[@]} # 读取数组长度 读取全部元素前面加上 # echo ${#arr[*]} echo ${#arr[@]} # 遍历下标 for(( i=0;i<${#strArr[@]};i++)) do echo ${strArr[i]}; done; # for in 遍历元素 for element in ${strArr[*]} do echo $element done # 3. 修改数组元素 strArr[0]="modify" echo ${strArr[0]} # 4. 删除元素 unset arr[1] echo ${#arr[*]} echo ${arr[*]} # 1 3 # !使用 unset 要注意,这其实并不是真正删除了该元素,而只是将该元素置空,所以使用下标遍历会出问题,如下 echo "数组遍历:" for(( i=0;i<${#arr[@]};i++)) do echo "index ${i} -> ${arr[i]}"; done; # index 0 -> 1 # index 1 -> # 解决 unset 无法真正删除的方法:重新赋值给新的数组 echo "数组遍历:" arr=( "${arr[@]}" ) for(( i=0;i<${#arr[@]};i++)) do echo "index ${i} -> ${arr[i]}"; done; # index 0 -> 1 # index 1 -> 3 判断语句

使用 if 和 fi 定义判断的边界,使用 then , elif , else 定义条件

#!/usr/bin/env bash #!/usr/bin/env bash a=10 b=20 if [ $a == $b ] then echo "相等" else echo "不相等" fi if [ $a == $b ] then echo "相等" elif [ $a -lt $b ] then echo "a 小于 b" else echo "其他情况" fi 函数

调用函数时,我们可以传入参数,可以通过 $n 来获取参数,这里的 n 表示 需要取的参数的索引,当n>=10时,需要使用${n}来获取参数

$# 传递给函数的参数个数,$* 和 $@ 显示所有传递给函数的参数,$? 表示函数的返回值,也可以用于获取上一个命令的退出状态,执行成功会返回 0,失败返回 1

# 定义函数 #!/usr/bin/env bash funWithParam(){ echo "参数个数:$#" # 参数个数:11 echo "传递给函数的所有参数:$*" # 传递给函数的所有参数:1 2 3 4 5 6 7 8 9 34 73 echo "$1" # 1 # 超过 9 的参数需要用 ${} 接收参数,否则直接显示数值 echo "$10" # 10 echo "${11}" # 73 } # 调用函数:函数名后面直接跟上参数 funWithParam 1 2 3 4 5 6 7 8 9 34 73 echo "$?" # 0 输入输出重定向

使用 > 将应该输出到终端上的数据重定向输出到文件,> 默认为覆盖文件,使用 >> 追加写入文件
使用 < 将默认从键盘输入的数据,定向为从文件输入

# who 命令用于显示系统中有哪些使用者正在上面 # 将结果输入 who.txt who > who.txt # wc -l 作用是计算文本行数 wc -l < who.txt

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

标准输入 (stdin):stdin 的文件描述符为 0,Unix 程序默认从 stdin 读取数据

标准输出 (stdout):stdout 的文件描述符为 1,Unix 程序默认向 stdout 输出数据

标准错误输出 (stderr):stderr 的文件描述符为 2,Unix 程序会向 stderr 流中写入错误信息

所以一般我们后台启动应用并且输出日志文件都使用:

nohup java -jar xxx.jar >> nohup.log 2>&1 &

nohup:(no hang up) 保证在退出帐户或者关闭终端之后继续运行相应的进程
>> nohup.log:将 java -jar xxx.jar 的输出追加到 nohup.log 文件
2>&1:将 java -jar xxx.jar 的 标准错误输出 也重定向到 标准输入
&:让进程在后台运行

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
如果希望 stderr 重定向到 file,可以这样写:

坑梳理

变量赋值时,变量名命名规则和其他语言类似,注意变量赋值时 = 两边不能有空格

数组 unset 元素,并不是真正的移除元素

获取参数时,当 n>=10 时,需要使用${n}来获取参数

常见的特殊 Shell 环境变量

$$ 表示当前Shell进程的ID,即pid

$0 表示当前脚本的绝对路径

$# 传递给脚本或函数的参数个数

$n 传递给脚本或函数的参数

$? 上个命令的退出状态

$* 和 $@ 传递给脚本或函数的所有参数

$n n 代表 1~9 其中任意一个数字,传递给脚本或函数该位置的参数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpxxy.html