资源
Shell中字符串、数值的比较linux shell数值比较和字符串比较
shell 数组遍历的3种方法
Shell位置参数(命令行参数)Shell 教程Shell脚本的超详细讲解(推荐!)
在shell中字符串与数值的比较方法是不同的,要注意区分
整数比较:
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
字符串比较:
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ], 与=等价
注意:==的功能在[[]]和[]中的行为是不同的,如下:
1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
3
4 [ $a == z* ] # File globbing 和word splitting将会发生
5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
!= 不等于,如:if [ "$a" != "$b" ], 这个操作符将在[[]]结构中使用模式匹配.
< 小于,在ASCII字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ] 在[]结构中"<"需要被转义.
> 大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ] 在[]结构中">"需要被转义.
-z 字符串为"null".就是长度为0.
-n 字符串不为"null"
SHELL下的数字比较及计算举例
比较:
方法一: if [ ${A} -lt ${B} ]; then ...
这是最基本的比较方法,使用lt(小于),gt(大于),le(小于等于),ge(大于等于),优点:还没发现;缺点:只能比较整数,使用lt,gt等不直观
方法二: if ((${A} < ${B})) then ...
这是CShell风格比较,优点:不用使用lt,gt等难记的字符串;缺点:还是只能比较整数
方法三: if (echo ${A} ${B} | awk '!($1>$2){exit 1}') then ...
这是使用awk比较,优点:可以比较小数;缺点:表达式太复杂,难记
方法四: if (echo ${A} - ${B} | bc -q | grep -q "^-"); then ...
这是使用bc计算比较,优点:可以比较小数;缺点:表达式更复杂,难记
计算:
方法一:typeset C=$(expr ${A} + ${B});
SHELL中的基本工具,优点:方便检测变量是否为数字;缺点:只能计算整数,且只能计算加减法,不能计算乘除法
方法二:let "C=${A}+${B}"; 或 let "C=A+B"
内嵌命令计算,优点:能计算乘除法及位运算等;缺点:只能计算整数
方法三:typeset C=$((A+B))
CShell风格的计算,优点:能计算乘除法及位运算等,简介,编写方便;缺点:不能计算小数
方法四:typeset C=${echo ${A} ${B} | awk '{print $1+$2}')
使用awk计算,优点:能计算小数,可以实现多种计算方式,计算灵活;缺点:表达式太复杂
方法五:typeset C=${echo ${A} + ${B} | bc -q)
使用awk计算,优点:能计算小数,计算方式比awk还多,计算灵活;缺点:表达式太复杂,小数点后面的位数必须使用scale=N来设置,否则可能会将结果截断为整数
shell数组的基本知识请参阅我的上一篇博客shell 数组
首先创建一个数组 array=( A B C D 1 2 3 4)
1.标准的for循环
for(( i=0;i<${#array[@]};i++)) do
#${#array[@]}获取数组长度用于循环
echo ${array[i]};
done;
2.for … in
遍历(不带数组下标):
for element in ${array[@]}
#也可以写成for element in ${array[*]}
do
echo $element
done
遍历(带数组下标):
for i in "${!arr[@]}";
do
printf "%s\t%s\n" "$i" "${arr[$i]}"
done
3.While循环法:
i=0
while [ $i -lt ${#array[@]} ]
#当变量(下标)小于数组长度时进入循环体
do
echo ${ array[$i] }
#按下标打印数组元素
let i++
done
#!/bin/bash
# _Command('scrcpy-x21', 'scrcpy --window-x 0 --window-y 0 -s 98badcb9'),
# _Command('scrcpy-google', 'scrcpy --window-x 0 --window-y 0 -s 8AWX10UKL'),
# 弄一个数组吧
array=("x21" "scrcpy --window-x 0 --window-y 0 -s 98badcb9" "google" "scrcpy --window-x 0 --window-y 0 -s 8AWX10UKL")
# 遍历数组
echo ${#array[@]}
echo "-----"
echo ${#array[*]}
# 遍历输出0到10
# #!/bin/bash
# for i in {0..10}; do
# echo $i;
# done;
ge_search_result.none-task-blog-2~all~sobaiduweb~default-0-116079747&spm=3001.4430
#java把for循环的变量输出,shell for循环、循环变量值付给其他shell脚本
#shell for 循环:
# #!第一种写法 类似C、Java
# for ((i=1; i<=100; i ++))
# do
# echo $i
# done
# #!第二种写法 in应用
# for i in {1..100}
# do
# echo $i
# done
# #!第三种写法 seq 使用
# for i in `seq 1 100`
# do
# echo $i
# done
# shell的取模操作
# echo $((2%4))
# echo "2 % 4" | bc
# $# 传递到脚本的参数个数
# $* 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
# $$ 脚本运行的当前进程ID号
# $! 后台运行的最后一个进程的ID号
# $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
# $- 显示Shell使用的当前选项,与set命令功能相同。
# $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
num=${#array[@]} # 个数
# linux shell 等待输入_shell中获得用户的输入
# read -p "do you want install [Y/N]:" choice
# case $choice in
# Y | y) echo 'installing';;
# N | n) echo 'bye';;
# esac
# echo "this is the end of script!"
# 跳出循环
#!/bin/bash
# while :
# do
# echo -n "输入 1 到 5 之间的数字:"
# read aNum
# case $aNum in
# 1|2|3|4|5) echo "你输入的数字为 $aNum!"
# ;;
# *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
# break
# ;;
# esac
# done
# continue
#!/bin/bash
# while :
# do
# echo -n "输入 1 到 5 之间的数字: "
# read aNum
# case $aNum in
# 1|2|3|4|5) echo "你输入的数字为 $aNum!"
# ;;
# *) echo "你输入的数字不是 1 到 5 之间的!"
# continue
# echo "游戏结束"
# ;;
# esac
# done
# case操作
# echo '输入 1 到 4 之间的数字:'
# echo '你输入的数字为:'
# read aNum
# case $aNum in
# 1) echo '你选择了 1';;
# 2) echo '你选择了 2';;
# 3) echo '你选择了 3';;
# 4) echo '你选择了 4';;
# *) echo '你没有输入 1 到 4 之间的数字';;
# esac
read -p "intput scrcpy devices:" devices
${array[devices+1]}
# isFind=false
# 循环找到值
# for((i=0; i<num; i++))
# do
# # 获取名称打印出来
# echo ${array[i]}
# # if [ $((i%2)) == 0 ] # 第一个
# # then
# # echo "请输入: ${array[i]}"
# # fi
# done
数组
定义一个数组方式如下:
数组名=(元素1 元素2 元素3 ... 元素n)
指定数组对应下标的元素进行赋值:
数组名[下标]=值
同时指定多个数组元素进行赋值:
数组名=([下标1]=值1 [下标2]=值2 ... [下标n]=值n)
引用数组对应下标的元素:
${数组名[下标]}
遍历数组元素
使用for(或while循环)循环遍历数组元素:
#!/bin/bash
a=(1 2 3 4 5 6)
for((i=0; i<10; i++))
do
echo "a[$i]=${a[$i]}"
done
除此以外我们还可以使用${a[*]}或者${a[@]}来遍历数组元素,具体代码如下:
#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[*]}
echo ${a[@]}
获取数组长度
# 我们可以使用#来获取数组长度,需要注意的是在shell脚本中我们越界访问数组时是不会报错的。
#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[*]}
echo "a len: ${#a[*]}"
我们先使用其获取数组中的元素后使用#获取元素个数即可。
合并数组
我们可以如下进行拼接:
#!/bin/bash
a=(1 2 3 4 5 6)
b=("hello" "zhaixue.cc")
c=(${a[*]} ${b[*]})
这样我们就将两个数组拼接起来了。
删除数组元素
删除数组元素
如果我们想要删除某个数组元素,具体代码如下:
#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[*]}
echo "a len: ${#a[*]}"
unset a[5]
echo ${a[*]}
echo "a len: ${#a[*]}"
执行结果如下:
我们如果要删除整个数组,可以执行unset a,举例代码如下:
#!/bin/bash
a=(1 2 3 4 5 6)
echo ${a[*]}
echo "a len: ${#a[*]}"
unset a
echo ${a[*]}
echo "a len: ${#a[*]}"
变量传参数
相关的变量含义为:
变量 | 含义 |
$0 | 代表执行的文件名 |
$1 | 代表传入的第1个参数 |
$n | 代表传入的第n个参数 |
$# | 参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$$ | 脚本运行的当前进程号 |
$! | 后台运行的最后一个进程的ID |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |