Loading...
Linux Shell 编程入门
9/19/2024, 9:06:12 PM
开发
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。 Linux Shell编程,和windows power Shel或CMD一样,都是支持系统命令的一种语言。 Linux 的 Shell 种类众多,常见的有:
本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh
,它同样也可以改为 #!/bin/bash
。
Bash Shell以下均简称Shell。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
.sh
结尾name="John" # 正确 name = "John" # 错误,会报语法错误,因为变量名和等号之间有了空格。 echo $name # 正确 echo $ name # 错误,会把" name"当作一个未知的变量名处理,报变量未定义的错误。
Linux中可以直接运行;Windows中安装Git,然后运行Git Bash(右键Git Bash here)。
#!/bin/bash echo "Hello World !"
shell中定义变量和python一样,随便写,但是有1个注意点:
案例如下:
#!/bin/bash RUNOOB="www.runoob.com" LD_LIBRARY_PATH="/bin/" _var="123" var2="abc"
使用变量时,在变量名前面加美元符号:
#!/bin/bash your_name="qinjx" echo $your_name echo ${your_name} #变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况: for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" done #但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($) your_name="tom" echo $your_name your_name="alibaba" echo $your_name
只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
#!/bin/bash myUrl="https://www.google.com" readonly myUrl #下面这句报错:/bin/sh: NAME: This variable is read only. myUrl="https://www.runoob.com"
删除变量:使用 unset 命令可以删除变量。
#!/bin/sh myUrl="https://www.runoob.com" unset myUrl #这里将没有任何输出 echo $myUrl
Shell 支持不同类型的变量,其中一些主要的类型包括:
declare -i
定义整数,如declare -i my_integer=42
; 小数————在 Linux shell 中没有直接定义小数变量的方式,但可以借助外部工具如 bc 来处理小数运算。declare -A
命令):
#!/bin/sh #整数索引数组(但元素全是字符串) my_array=(1 2 3 4 5) #关联数组:declare -A declare -A associative_array associative_array["name"]="John" associative_array["age"]=30
echo $PATH
$0
表示脚本的名称$1
, $2
, 等表示脚本的参数, 依此类推$#
表示传递给脚本的参数数量,即 传递到脚本的参数个数$?
表示上一个命令的退出状态等。字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号字符串的限制:
双引号的优点:
#!/bin/sh your_name="runoob" #使用双引号拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 #使用单引号拼接 greeting_2='hello, '$your_name' !' greeting_3='hello, ${your_name} !' echo $greeting_2 $greeting_3
#!/bin/sh string="abcd" echo ${#string} #输出 4 string="abcd" #变量为字符串时,${#string} 等价于 ${#string[0]}: echo ${#string[0]} #输出 4
string="runoob is a great site" #从字符串第 2 个字符开始截取 4 个字符 echo ${string:1:4} #输出 unoo
string="runoob is a great site" #查找字符 i 或 o 的位置(哪个字母先出现就计算哪个): 注意以下脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。 echo `expr index "$string" io` #输出 4
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
#定义数组:注意数组之间用空格分隔而非逗号 array_name=(1 1 3 jim Tim) echo $array_name # 1,1,3,jim,Tim echo ${!array_name[@]}; # 0 1 2 3 4 获取数组的所有键值(前面加上!感叹号) echo ${array_name[3]} # jim #取得数组元素的个数: length1=${#array_name[@]} echo $length1; #5 #或者 length2=${#array_name[*]} echo $length2; #5 #取得数组单个元素的长度:索引为3的元素-jim,长度为3 length3=${#array_name[3]} echo $length3;
#
开头的行就是注释,会被解释器忽略:
#-------------------------------------------- #这是一个注释 #author:菜鸟教程 #site:www.runoob.com #slogan:学的不仅是技术,更是梦想! #-------------------------------------------- #####用户配置区 开始##### #这里可以添加脚本描述信息 #####用户配置区 结束#####
:<<EOF 注释内容... 注释内容... 注释内容... EOF
:
是一个空命令,用于执行后面的 Here 文档,<<EOF
表示开启 Here 文档,COMMENT
也是 Here 文档的标识符,在这两个标识符之间的内容都会被视为注释,不会被执行。因此上面也可以替换为:
#替换1 : <<'COMMENT' 这是注释的部分。 可以有多行内容。 COMMENT #替换2: : + 空格(注意中间的空格) + 单引号 : ' 这是注释的部分。 可以有多行内容。 ' #替换3 :<<! 注释内容... 注释内容... 注释内容... !
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ',加减乘除同理):
#!/bin/bash val=`expr 2 + 2` echo "两数之和为 : $val" #代码中的 [] 也可以执行基本的算数运算,如: a=5 b=6 #注意等号两边不能有空格 result=$[a+b] echo "result 为: $result"
两点注意:
#!/bin/bash a=10 b=20 if [ $a -eq $b ] # 检测两个数是否相等,相等返回 true。 then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi if [ $a -ne $b ] # 检测两个数是否不相等,不相等返回 true then echo "$a -ne $b: a 不等于 b" else echo "$a -ne $b : a 等于 b" fi if [ $a -gt $b ] # 检测左边的数是否大于右边的,如果是,则返回 true。 then echo "$a -gt $b: a 大于 b" else echo "$a -gt $b: a 不大于 b" fi if [ $a -lt $b ] # 检测左边的数是否小于右边的,如果是,则返回 true。 then echo "$a -lt $b: a 小于 b" else echo "$a -lt $b: a 不小于 b" fi if [ $a -ge $b ] # 检测左边的数是否大于等于右边的,如果是,则返回 true。 then echo "$a -ge $b: a 大于或等于 b" else echo "$a -ge $b: a 小于 b" fi if [ $a -le $b ] # 检测左边的数是否小于等于右边的,如果是,则返回 true。 then echo "$a -le $b: a 小于或等于 b" else echo "$a -le $b: a 大于 b" fi
Shell运算符还是挺麻烦的,可以看看相关菜鸟教程的文档: 更多Shell运算符
因为上面的操作符太多、太麻烦了,所以迎来了集成命令test
:
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试和比较。
数值测试
num1=100 num2=100 if test $[num1] -eq $[num2] then echo '两个数相等!' else echo '两个数不相等!' fi
test命令数值测试参数:
字符串测试
num1="ru1noob" num2="runoob" if test $num1 = $num2 then echo '两个字符串相等!' else echo '两个字符串不相等!' fi
test字符串测试命令参数
if语句末尾的 fi 就是 if 倒过来拼写,后面还会遇到类似的。
if condition1 then command1 elif condition2 then command2 else commandN fi
案例:
a=10 b=20 if [ $a == $b ] then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi
使用 ((...))
作为判断语句:
a=10 b=20 if (( $a == $b )) then echo "a 等于 b" elif (( $a > $b )) then echo "a 大于 b" elif (( $a < $b )) then echo "a 小于 b" else echo "没有符合的条件" fi
if else 语句经常与 test 命令
结合使用
num1=$[2*3] num2=$[1+5] if test $[num1] -eq $[num2] then echo '两个数字相等!' else echo '两个数字不相等!' fi
case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。 可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令, 格式为:
case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac
案例
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
一般格式为
for var in item1 item2 ... itemN do command1 command2 ... commandN done #写成一行 for var in item1 item2 ... itemN; do command1; command2… done;
案例
for loop in 1 2 3 4 5 do echo "The value is: $loop" # 这里的变量时循环时定义的 done
格式为:
while condition do command done
案例
#!/bin/bash int=1 while(( $int<=5 )) do echo $int let "int++" done
用户输入内容检测:
echo '按下 <CTRL-D> 退出' echo -n '输入你最喜欢的网站名: ' while read FILM do echo "是的!$FILM 是一个好网站" done
两种循环的无限循环格式为:
无限循环 无限循环语法格式: while : do command done 或者 while true do command done 或者 for (( ; ; ))
跳出循环:
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell 使用两个命令来实现该功能:break
和 continue
。
continue 命令与 break 命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。用法和其他一般语言一致
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
break 案例:
#!/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
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。shell中函数的定义格式如下:
#function 关键字定义函数时可选的 [ function ] funname [()]{ action; [return int;] }
案例:
#!/bin/bash demoFun(){ echo "这是我的第一个 shell 函数!" } echo "-----函数开始执行-----" demoFun # 这是我的第一个 shell 函数! echo "-----函数执行完毕-----" funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn #函数返回值在调用该函数后通过 $? 来获得。 echo "输入的两个数字之和为 $? !"
函数的return
语句只能返回一个介于 0 到 255 之间的整数,而两个输入数字的和可能超过这个范围。要解决这个问题,您可以修改 return 语句,直接使用 echo 输出和而不是使用 return:
#注意这样的话 函数体里面只能存在最后一个echo了 funWithReturn1(){ aNum=400 anotherNum=1000 sum=$(($aNum + $anotherNum)) echo $sum } result1=$(funWithReturn1) echo "输入的两个数字之和为 $result1"
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
#!/bin/bash funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } #调用时 函数类似命令 funWithParam 1 2 3 4 5 6 7 8 9 34 73
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
重定向命令列表如下:
例如
#将输出内容重定向到文件 echo "菜鸟教程:www.runoob.com" > users
文章目录