热度 10| ||
#2023.8.7---------------------------------------------------
一个用 C 语言编写的程序,命令语言,用户使用 Linux 的桥梁,sh是一种Unix Shell
Shell 脚本(shell script)是为shell编写的脚本程序
C Shell(/usr/bin/csh)
Bourne Shell(/usr/bin/sh或/bin/sh)
↑↓这两个一般并不区分,即#!/bin/sh同样可改为#!/bin/bash,即Bash/Shell
#!/bin/sh #!/bin/bash
Bourne Again Shell(/bin/bash)
#! #是一个约定的标记,告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell
建文件test.sh .sh扩展名不影响脚本执行,用php写shell脚本就.php
#!/bin/bash echo "Hi makabaka !" #echo 用于向窗口输出文本
执行Shell脚本
方法一:
①先在terminal把脚本改为可执行程序
chmod +x ./filename #使脚本具有执行权限
②再执行
./filename #执行脚本
方法二:
/bin/sh filename #直接运行解释器
/bin/php filename
sh/bash filename
Shell变量
变量名和等号之间不能有空格
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
中间不能有空格,可以用下划线 _
不能使用标点符号
不能用bash里的关键字
your_name="dujinyu" #变量名里不用加$ echo ${your_name} #{}可以去掉,主要是为了帮解释器识别变量边界##好的编程习惯耶依!!#
$ ----------------定义变量
#!/bin/bash name1="brooooo" readonly name1 #readonly -------定义name1为只读变量,只读变量的值不能改变 name1="missssss" #尝试修改变量值,执行时会报错
unset your_name #unset -----删除变量,不能删除只读变量,删除后下面不能再使用
变量类型
局部变量
在该脚本中定义的,仅在当前shell脚本中有效,其他shell程序不能访问局部变量
环境变量
所有程序都能访问环境变量,有些程序需要环境变量来保证其正常运行
shell变量
是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
字符串
单引号
date='today is 2023/0808'
单引号里的任何字符都会原样输出,单引号字符串中的变量无效
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
双引号
your_name="jinyu" str="Hello, I know you are \"$your_name\"! \n" echo -e $str
双引号里可以有变量
双引号里可以出现转义字符
数组
读取数组的一般格式
valuen=${name[n]}
注释
以 # 开头的行就是注释,会被解释器忽略
:<<EOF #EOF可以改成任何其他的符号 ' ! 等 注释内容... 注释内容... 注释内容... EOF
echo命令
用于字符串的输出
echo "city walk brooo" #显示普通字符串
echo "\city walk broo\" #显示转义字符 "city walk broo"
#!/bin/bash read name echo "$name It is my cat"
以上代码保存为 test.sh,name 接收标准输入的变量
[dgg123 ~]# sh test.sh DAGE #标准输入 DAGE It is my cat #输出
echo -e "OK! \n" # -e 开启转义 echo "It is a test" #显示换行
#!/bin/sh echo -e "OK! \c" # -e 开启转义 \c 不换行 echo "It is a test"
echo `date` # 反引号 ` ,显示命令执行结果
test命令
检查某个条件是否成立,数值、字符和文件三个方面
num1=100 num2=100 if test $[num1] -eq $[num2] then echo '两个数相等!' else echo '两个数不相等!' fi
#!/bin/bash a=5 b=6 result=$[a+b] # 等号两边不能有空格 []执行基本的算数运算 echo "result 为: $result"
num1="ru1noob" num2="runoob" if test $num1 = $num2 then echo '两个字符串相等!' else echo '两个字符串不相等!' fi
cd /bin if test -e ./bash then echo '文件已存在!' else echo '文件不存在!' fi
! 非 -a 与 -o 或
cd /bin if test -e ./notFile -o -e ./bash then echo '至少有一个文件存在!' else echo '两个文件都不存在' fi
if else
if condition then command1 command2 ... commandN fi
if condition1 then command1 elif condition2 #if else语句 then command2 else commandN fi
if [ "$a" -gt "$b" ]; then # [...] 判断语句中大于使用 -gt,小于使用 -lt ... fi
if (( a > b )); then #如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 > 和 < ... fi
for 循环
for var in item1 item2 ... itemN do command1 command2 ... commandN done
while 循环
while condition do command done
#!/bin/bash int=1 while(( $int<=5 )) do echo $int let "int++" done
untill 循环
until condition do command done
#!/bin/bash a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done
case...esac
case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;; esac
两个分号 ;; 表示 break,即执行结束
使用星号 * 捕获该值,再执行后面的命令
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
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
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