Linux基础4-Shell语法
发布时间:2022-09-17 15:16:58 所属栏目:Linux 来源:
导读: #! /bin/bash
来指明bash为脚本解释器。
1 概论1.1 脚本示例
#! /bin/bash
echo "Hello World!"
1.2 运行方式
# 第一种
chmod +x test.sh # 使脚本具有可执行权限
来指明bash为脚本解释器。
1 概论1.1 脚本示例
#! /bin/bash
echo "Hello World!"
1.2 运行方式
# 第一种
chmod +x test.sh # 使脚本具有可执行权限
|
#! /bin/bash 来指明bash为脚本解释器。 1 概论1.1 脚本示例 #! /bin/bash echo "Hello World!" 1.2 运行方式 # 第一种 chmod +x test.sh # 使脚本具有可执行权限 ./test.sh # 当前路径下执行 # 第二种 bash test.sh # 用解释器输出 2 注释2.1 单行注释 每行中#之后均为注释. # 这是一个注释 echo "My name is yrx" # 这也是一个注释 2.2 多行注释 格式: :< 其中EOF可以替换为任意其它字符串。例如: :< 3 变量3.1 定义变量 定义变量,不需要加 $ 符号,例如: name1='yrx' # 单引号定义字符串 name2="yrx" # 双引号定义字符串 name3=yrx # 不加引号定义字符串 定义变量时,等号两边不能有空格;定义变量的时候变量都是字符串,但当变量需要是整数时,会自动把变量转换成整数;被声明为只读的变量无法被unset删除;bash可以用来开一个新的进程,exit或ctrl+d退出新的bash;字符串中,不加引号和双引号效果相同.3.2 使用变量 使用变量,需要加上 \$ 符号,或者 \${} 符号。花括号是可选的,主要为了帮助解释器识别边界。 name=yrx echo $name # 输出yrx echo ${name} # 输出yrx echo ${name}dfjb # 输出yrxdfjb 3.3 只读变量 使用readonly或者declare可以将变量变为只读。 name=yrx readonly name declare -r name # 两种方法都可以 name=yxr # 会报错 3.4 删除变量 unset可以删除变量。 name=yrx unset name echo $name # 输出空行 3.5 变量类型自定义变量(局部变量)——子进程不能访问的变量。环境变量(全局变量)————子进程可以访问的变量。 自定义变量改成环境变量: name=yrx # 定义变量 export name # 第一种办法 declare -x name # 第二种办法 环境变量改为自定义变量 export name=yrx # 定义环境变量 declare +x name # 改为自定义变量 tmux经ctrl a + % 分屏得到的两个界面实际上是两个bash,在一个bash中自定义的bash变量仅可以被当前bash访问,通过bash命令开启的子进程也无法访问。export后变量变为环境变量,就可以被全局访问。 3.6 字符串 字符串可以用单引号、双引号、不用引号来定义。 单引号与双引号的区别: name=yrx echo 'hello, $name \"hh\"' # hello, $name \"hh\" echo "hello, $name \"hh\"" # hello, yrx "hh" 获取字符串长度: name="yrx" echo ${#name} # 3 提取子串: name="hello,yrx" echo ${name:0:5} # 提取从0开始的5个字符 4 默认变量4.1 文件参数变量 在执行shell脚本时,可以向脚本传递参数。\$1是第一个参数,\$2是第二个参数,依此类推。 特殊地,\$0是文件名(包含路径)。 #! /bin/bash echo "filename:"$0 echo "first var:"$1 echo "second var:"$2 echo "third var:"$3 执行:(可以传入参数) chmod +x knowar.sh ./knowvar.sh 1 4 6 filename:./knowvar.sh first var:1 second var:4 third var:6 4.2 其它默认变量 网页版格式有误! 参数说明 \$# 代表传入参数的个数。 \$* 由所有参数构成的用空格隔开的字符串。 \$\@ 每个参数分别用双引号括起来的字符串。 \$\$ 脚本当前运行的进程ID。 上一条命令的退出状态(不是stdout,是exit code),0表示正常退出,其他值表示错误。 \$(command) 返回command这条命令的stdout 可嵌套。 'command' 返回command这条命令的stdout 不可嵌套。 5 数组 数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。 数组下标从0开始。 5.1 定义 数组用小括号表示,元素之间用空格隔开。 array=(1 abc "def" yrx) 也可以直接定义数组中某个元素的值。 array[0]=9 array[1]=pp array[2]="qq" array[3]=dfjb 5.2 读取数组中某个元素的值 格式: ${array[index]} 例如: array=(1 abc "def" dfjb) echo ${array[0]} echo ${array[1]} echo ${array[2]} echo ${array[3]} 5.3 读取整个数组 格式: ${array[@]} # 第一种写法 ${array[*]} # 第二种写法 5.4 数组长度 类似于字符串。 ${#array[@]} ${#array[*]} 6 expr命令6.1 格式 expr命令用于求表达式的值,格式为: expr 表达式 表达式说明: 用空格隔开每一项;把反斜杠放在shell特定的字符面前(发现表达式运行错误时,可以试试转义);对包含空格和其他特殊字符的字符串要用引号括起来;expr会在stdout中输出结果。如果为逻辑关系表达式,则结果为真,stdout为1linux语句,否则为0;expr的exit code:如果为逻辑关系表达式,则结果为真,exit code为0,否则为1.6.2 字符串表达式 #! /bin/bash str="Hello world!" echo `expr length "$str"` # 不是单引号,是左上角的符号,表示执行这个命令 echo `expr index "$str" awl` echo `expr substr "$str" 3 5` 12 3 llo w 注意从0开始! 6.3 算术表达式 expr支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。 #! /bin/bash a=15 b=7 echo `expr $a + $b` #22 echo `expr $a - $b` #8 echo `expr $a \* $b` #105 echo `expr $a / $b` #2 echo `expr $a % $b` #1 echo `expr \( $a + 1 \) \* \( $b - 1 \)` #96 6.4 逻辑关系表达式 a=3 b=4 echo `expr $a \> $b` # 输出0,>需要转义 echo `expr $a '<' $b` # 输出1,也可以将特殊字符用引号引起来 echo `expr $a '>=' $b` # 输出0 echo `expr $a \<\= $b` # 输出1 c=0 d=5 echo `expr $c \& $d` # 输出0 echo `expr $a \& $b` # 输出3 echo `expr $c \| $d` # 输出5 echo `expr $a \| $b` # 输出3 7 read命令 read命令用于从标准输入中读取单行数据。当读到文件结束符时,exit code为1,否则为0。 参数说明: -p:后面可以接提示信息;-t:后面跟秒数,定义输入字符的等待时间,超过等待时间后会自动忽略此命令。 示例: read name yrx echo $name yrx read -p "Enter your name:" -t 30 name Enter your name:yrx read -p "Enter your name:" -t 5 name 8 echo命令8.1 输出格式 echo用于输出字符串。格式: echo STRING 原样输出字符串,不进行转义或取变量: name=yrx echo '$name\"' # 单引号 显示命令的执行结果: echo `date` # 左上角的那个点 8.2 显示字符串 普通字符串: echo "Hello world!" echo Hello world! # 引号可以省略 转义字符: echo " \"Hello world! \" " echo \"Hello world! \" 8.3 显示变量 name=yrx echo "My name is ${name}" 8.4 显示换行/不换行 显示换行: echo -e "hi\n" # \n换行 echo "yrx" 输出: hi yrx 显示不换行: echo -e "Hi \c" # \c 不换行 echo yrx 输出: Hi yrx 8.5 显示结果定向至文件 echo "Hello world" > output.txt # 将内容以覆盖的方式输出到output.txt 9 printf命令 printf命令用于格式化输出,类似于C/C++中的printf函数。 默认不会在字符串末尾添加换行符。 格式: printf format-string [arguments...] 示例: printf "d.\n" 123 # 123. printf "%-10.2f.\n" 123.45678 #123.46 . printf "My name is %s\n" "yrx" #My name is yrx printf "%d + %d = %d\n" 2 3 `expr 2 \+ 3` #2 + 3 = 5 10 test命令与判断符号[]10.1 逻辑运算符10.2 test命令在命令行中输入man test,可以查看test命令的用法。 test命令用于判断文件类型,以及对变量作比较。 test命令用exit code返回结果,而不是使用stdout。0表示真,非0表示假。 test 2 -lt 3 echo $? # 0,$?输出上一条命令的返回值 tets 2 -gt 3 echo $? # 1 ls homework output.txt test.sh tmp test -e test.sh && echo "exist" || echo "Not exist" exist # test.sh 文件存在 test -e test2.sh && echo "exist" || echo "Not exist" Not exist # testh2.sh 文件不存在 10.3 文件判断 文件类型判断: test -e filename # 文件是否存在 test -f filename # 是否为文件 test -d filename # 是否为目录 文件权限判断: test -r filename # 判断文件是否可读 test -w filename # 可写 test -x filename # 可执行 test -s filename # 是否为空文件 10.4 整数间的比较 test $a -eq $b # 是否相等 -eq # 等于 -ne # 不等于 -gt # 大于 -lt # 小于 -ge # 大于等于 -lt # 小于等于 10.5 字符串比较 test -z STRING # 判断STRING是否为空,如果为空,返回true test -n STRING # 判断STRING是否非空,如果非空,返回true(-n可以省略) test str1 == str2 # 判断两字符串是否相等 test str1 != str2 # 判断两字符串是否不相等 10.6 多重条件判定 test -r filename -a -x filename # 两条件是否同时成立 -a -o # 至少一个成立 ! # 取反 10.7 符号判断[] []与test的用法几乎一样,更常用于if语句中。另外 [ [ ] ]是[]的加强版,支持的特性更多。 例如: [ -2 -lt 3 ] # 为真,返回0 echo $? # 0 ls homework output.txt test.sh tmp [ -e test.sh ] && echo "exist" || echo "Not exist" exist # test.sh 文件存在 [ -e test2.sh ] && echo "exist" || echo "Not exist" Not exist # testh2.sh 文件不存在 注意: 例如: name="dfjb yrx" [ $name == "dfjb yrx" ] # 错误,中间有空格 [ "$name" == "dfjb yrx" ] # 正确 11 判断语句 if...then 11.1 单层if if condition then 语句1 语句2 语句2 ... fi 示例: #! /bin/bash a=3 if [ $a -gt 2 ] then echo `expr ${a} + 2` fi 11.2 if-else if condition then 语句1 语句2 ... else 语句1 语句2 ... fi 示例: #! /bin/bash a=3 if [ $a -gt 3 ] then echo `expr ${a} + 2` else echo `expr ${a} \* 2 ` echo hhh fi 11.3 多层if-elif-elif-else if condition then 语句1 语句2 ... elif condition then 语句1 语句2 ... elif condition then 语句1 语句2 ... else 语句1 语句2 ... fi 示例: #! /bin/bash read -p "score 0-100 :" score if [ $score -gt 90 ] then echo "very good" elif [ $score -gt 60 ] then echo good else echo bad fi 11.4 case-esca形式 类似于C/C++中的switch语句。 命令格式: case $变量 in 值1) 语句1 语句2 ... ;; # 相当于break 值2) 语句1 语句2 ... ;; *) # 相当于default 语句1 语句2 ... ;; esac 示例: #! /bin/bash read -p "score 1-4 :" score case $score in 3) echo "very good" echo "${score}" ;; 2) echo "good" ;; 1) echo "bad" ;; *) echo "very bad" ;; esac 12 循环语句 13 函数 14 exit命令 15 文件重定向 16 引入外部脚本 (编辑:云计算网_宿迁站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读


浙公网安备 33038102330477号