资源

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[*]}"
执行结果如下:

shell基本命令及应用_shell脚本


我们如果要删除整个数组,可以执行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[*]}"

shell基本命令及应用_bash_02

变量传参数

相关的变量含义为:

变量

含义

$0

代表执行的文件名

$1

代表传入的第1个参数

$n

代表传入的第n个参数

$#

参数个数

$*

以一个单字符串显示所有向脚本传递的参数。

$@

与$*相同,但是使用时加引号,并在引号中返回每个参数

$$

脚本运行的当前进程号

$!

后台运行的最后一个进程的ID

$?

显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。