外贸网站优化服务赣州信息港主页

当前位置: 首页 > news >正文

外贸网站优化服务,赣州信息港主页,企业网址免费注册,网上做名片的网站1.shell语法 概论 概论 shell是我们通过命令行与操作系统沟通的语言。shell脚本可以直接在命令行中执行#xff0c;也可以将一套逻辑组织成一个文件#xff0c;方便复用。 AC Terminal中的命令行可以看成是一个“shell脚本在逐行执行”。Linux中常见的shell脚本有很多种也可以将一套逻辑组织成一个文件方便复用。 AC Terminal中的命令行可以看成是一个“shell脚本在逐行执行”。Linux中常见的shell脚本有很多种常见的有Bourne Shell(/usr/bin/sh或/bin/sh) Bourne Again Shell(/bin/bash) C Shell(/usr/bin/csh) K Shell(/usr/bin/ksh) zsh … Linux系统中一般默认使用bash所以接下来讲解bash中的语法。 文件开头需要写#! /bin/bash指明bash为脚本解释器。学习技巧 不要死记硬背遇到含糊不清的地方可以在AC Terminal里实际运行一遍。脚本示例 新建一个test.sh文件内容如下#! /bin/bash echo Hello World! 运行方式 作为可执行文件acs9e0ebfcd82d7:$ chmod x test.sh # 使脚本具有可执行权限 acs9e0ebfcd82d7:\( ./test.sh # 当前路径下执行 Hello World! # 脚本输出 acs9e0ebfcd82d7:~\) /home/acs/test.sh # 绝对路径下执行 Hello World! # 脚本输出 acs9e0ebfcd82d7:~\( ~/test.sh # 家目录路径下执行 Hello World! # 脚本输出 用解释器执行acs9e0ebfcd82d7:~\) bash test.sh Hello World! # 脚本输出 注释 单行注释 每行中#之后的内容均是注释。# 这是一行注释echo Hello World # 这也是注释 多行注释 格式:EOF 第一行注释 第二行注释 第三行注释 EOF 其中EOF可以换成其它任意字符串。例如:abc 第一行注释 第二行注释 第三行注释 abc:! 第一行注释 第二行注释 第三行注释 ! 变量 定义变量 定义变量不需要加\(符号例如name1yxc # 单引号定义字符串 name2yxc # 双引号定义字符串 name3yxc # 也可以不加引号同样表示字符串 使用变量 使用变量需要加上\)符号或者\({}符号。花括号是可选的主要为了帮助解释器识别变量边界。nameyxc echo \)name # 输出yxc echo \({name} # 输出yxc echo \){name}acwing # 输出yxcacwing 只读变量 使用readonly或者declare可以将变量变为只读。nameyxc readonly name declare -r name # 两种写法均可nameabc # 会报错因为此时name只读 删除变量 unset可以删除变量。nameyxc unset name echo \(name # 输出空行 变量类型 自定义变量局部变量 子进程不能访问的变量 环境变量全局变量 子进程可以访问的变量 自定义变量改成环境变量acs9e0ebfcd82d7:~\) nameyxc # 定义变量 acs9e0ebfcd82d7:$ export name # 第一种方法 acs9e0ebfcd82d7:\( declare -x name # 第二种方法 环境变量改为自定义变量acs9e0ebfcd82d7:~\) export nameyxc # 定义环境变量 acs9e0ebfcd82d7:\( declare x name # 改为自定义变量 字符串 字符串可以用单引号也可以用双引号也可以不用引号。单引号与双引号的区别单引号中的内容会原样输出不会执行、不会取变量 双引号中的内容可以执行、可以取变量 nameyxc # 不用引号 echo hello, \)name \hh\ # 单引号字符串输出 hello, \(name \hh\ echo hello, \)name \hh\ # 双引号字符串输出 hello, yxc hh 获取字符串长度nameyxc echo \({#name} # 输出3 提取子串namehello, yxc echo \){name:0:5} # 提取从0开始的5个字符默认变量 文件参数变量 在执行shell脚本时可以向脚本传递参数。\(1是第一个参数\)2是第二个参数以此类推。特殊的\(0是文件名包含路径。例如创建文件test.sh#! /bin/bashecho 文件名\)0 echo 第一个参数\(1 echo 第二个参数\)2 echo 第三个参数\(3 echo 第四个参数\)4 然后执行该脚本acs9e0ebfcd82d7:\( chmod x test.sh acs9e0ebfcd82d7:~\) ./test.sh 1 2 3 4 文件名./test.sh 第一个参数1 第二个参数2 第三个参数3 第四个参数4 其它参数相关变量 参数 说明 \(# 代表文件传入的参数个数如上例中值为4 \)* 由所有参数构成的用空格隔开的字符串如上例中值为\(1 \)2 \(3 \)4 \( 每个参数分别用双引号括起来的字符串如上例中值为\)1 \(2 \)3 \(4 \)\( 脚本当前运行的进程ID \)? 上一条命令的退出状态注意不是stdout而是exit code。0表示正常退出其他值表示错误 \((command) 返回command这条命令的stdout可嵌套 command 返回command这条命令的stdout不可嵌套数组 数组中可以存放多个不同类型的值只支持一维数组初始化时不需要指明数组大小。 数组下标从0开始。定义 数组用小括号表示元素之间用空格隔开。例如array(1 abc def yxc) 也可以直接定义数组中某个元素的值array[0]1 array[1]abc array[2]def array[3]yxc 读取数组中某个元素的值 格式\){array[index]} 例如array(1 abc def yxc) echo \({array[0]} echo \){array[1]} echo \({array[2]} echo \){array[3]} 读取整个数组 格式\({array[]} # 第一种写法 \){array[]} # 第二种写法 例如array(1 abc def yxc)echo \({array[]} # 第一种写法 echo \){array[]} # 第二种写法 数组长度 类似于字符串\({#array[]} # 第一种写法 \){#array[]} # 第二种写法 例如array(1 abc def yxc)echo \({#array[]} # 第一种写法 echo \){#array[]} # 第二种写法expr命令 expr命令用于求表达式的值格式为expr 表达式 表达式说明用空格隔开每一项 用反斜杠放在shell特定的字符前面发现表达式运行错误时可以试试转义 对包含空格和其他特殊字符的字符串要用引号括起来 expr会在stdout中输出结果。如果为逻辑关系表达式则结果为真时stdout输出1否则输出0。 expr的exit code如果为逻辑关系表达式则结果为真时exit code为0否则为1。 字符串表达式 length STRING 返回STRING的长度 index STRING CHARSET CHARSET中任意单个字符在STRING中最前面的字符位置下标从1开始。如果在STRING中完全不存在CHARSET中的字符则返回0。 substr STRING POSITION LENGTH 返回STRING字符串中从POSITION开始长度最大为LENGTH的子串。如果POSITION或LENGTH为负数0或非数值则返回空字符串。 示例strHello World!echo expr length \(str # 不是单引号表示执行该命令输出12 echo expr index \)str aWd # 输出7下标从1开始 echo expr substr \(str 2 3 # 输出 ell 整数表达式 expr支持普通的算术操作算术表达式优先级低于字符串表达式高于逻辑关系表达式。 - 加减运算。两端参数会转换为整数如果转换失败则报错。* / % 乘除取模运算。两端参数会转换为整数如果转换失败则报错。() 可以改变优先级但需要用反斜杠转义示例a3 b4echo expr \)a \(b # 输出7 echo expr \)a - \(b # 输出-1 echo expr \)a * \(b # 输出12*需要转义 echo expr \)a / \(b # 输出0整除 echo expr \)a % \(b # 输出3 echo expr \( \)a 1 ) * ( \(b 1 \) # 输出20值为(a 1) * (b 1) 逻辑关系表达式 | 如果第一个参数非空且非0则返回第一个参数的值否则返回第二个参数的值但要求第二个参数的值也是非空或非0否则返回0。如果第一个参数是非空或非0时不会计算第二个参数。如果两个参数都非空且非0则返回第一个参数否则返回0。如果第一个参为0或为空则不会计算第二个参数。 ! 比较两端的参数如果为true则返回1否则返回0。””是””的同义词。”expr”首先尝试将两端参数转换为整数并做算术比较如果转换失败则按字符集排序规则做字符比较。() 可以改变优先级但需要用反斜杠转义 示例a3 b4echo expr \)a \ \(b # 输出0需要转义 echo expr \)a \(b # 输出1也可以将特殊字符用引号引起来 echo expr \)a \(b # 输出0 echo expr \)a \ \(b # 输出1c0 d5echo expr \)c \ \(d # 输出0 echo expr \)a \ \(b # 输出3 echo expr \)c | \(d # 输出5 echo expr \)a | \(b # 输出3 read命令 read命令用于从标准输入中读取单行数据。当读到文件结束符时exit code为1否则为0。参数说明-p: 后面可以接提示信息 -t后面跟秒数定义输入字符的等待时间超过等待时间后会自动忽略此命令 实例acs9e0ebfcd82d7:~\) read name # 读入name的值 acwing yxc # 标准输入 acs9e0ebfcd82d7:\( echo \)name # 输出name的值 acwing yxc #标准输出 acs9e0ebfcd82d7:\( read -p Please input your name: -t 30 name # 读入name的值等待时间30秒 Please input your name: acwing yxc # 标准输入 acs9e0ebfcd82d7:~\) echo \(name # 输出name的值 acwing yxc # 标准输出echo命令 echo用于输出字符串。命令格式echo STRING 显示普通字符串 echo Hello AC Terminal echo Hello AC Terminal # 引号可以省略 显示转义字符 echo \Hello AC Terminal\ # 注意只能使用双引号如果使用单引号则不转义 echo \Hello AC Terminal\ # 也可以省略双引号 显示变量 nameyxc echo My name is \)name # 输出 My name is yxc 显示换行 echo -e Hi\n # -e 开启转义 echo acwing 输出结果Hiacwing 显示不换行 echo -e Hi \c # -e 开启转义 \c 不换行 echo acwing 输出结果Hi acwing 显示结果定向至文件 echo Hello World output.txt # 将内容以覆盖的方式输出到output.txt中 原样输出字符串不进行转义或取变量(用单引号) nameacwing echo \(name\ 输出结果\)name
显示命令的执行结果 echo date 输出结果Wed Sep 1 11:45:33 CST 2021printf命令 printf命令用于格式化输出类似于C/C中的printf函数。默认不会在字符串末尾添加换行符。命令格式printf format-string [arguments…] 用法示例 脚本内容printf %10d.\n 123 # 占10位右对齐 printf %-10.2f.\n 123.123321 # 占10位保留2位小数左对齐 printf My name is %s\n yxc # 格式化输出字符串 printf %d * %d %d\n 2 3 expr 2 * 3 # 表达式的值作为参数 输出结果123. 123.12 . My name is yxc 2 * 3 6test命令与判断符号[] 逻辑运算符和||表示与|| 表示或 二者具有短路原则 expr1 expr2当expr1为假时直接忽略expr2 expr1 || expr2当expr1为真时直接忽略expr2 表达式的exit code为0表示真为非零表示假。与C/C中的定义相反 test命令 在命令行中输入man test可以查看test命令的用法。test命令用于判断文件类型以及对变量做比较。test命令用exit code返回结果而不是使用stdout。0表示真非0表示假。例如test 2 -lt 3 # 为真返回值为0 echo \(? # 输出上个命令的返回值输出0 acs9e0ebfcd82d7:~\) ls # 列出当前目录下的所有文件 homework output.txt test.sh tmp acs9e0ebfcd82d7:$ test -e test.sh echo exist || echo Not exist exist # test.sh 文件存在 acs9e0ebfcd82d7:\( test -e test2.sh echo exist || echo Not exist Not exist # testh2.sh 文件不存在 文件类型判断 命令格式test -e filename # 判断文件是否存在 测试参数 代表意义 -e 文件是否存在 -f 是否为文件 -d 是否为目录 文件权限判断 命令格式test -r filename # 判断文件是否可读 测试参数 代表意义 -r 文件是否可读 -w 文件是否可写 -x 文件是否可执行 -s 是否为非空文件 整数间的比较 命令格式test \)a -eq \(b # a是否等于b 测试参数 代表意义 -eq a是否等于b -ne a是否不等于b -gt a是否大于b -lt a是否小于b -ge a是否大于等于b -le a是否小于等于b 字符串比较 测试参数 代表意义 test -z STRING 判断STRING是否为空如果为空则返回true test -n STRING 判断STRING是否非空如果非空则返回true-n可以省略 test str1 str2 判断str1是否等于str2 test str1 ! str2 判断str1是否不等于str2 多重条件判定 命令格式test -r filename -a -x filename 测试参数 代表意义 -a 两条件是否同时成立 -o 两条件是否至少一个成立 ! 取反。如 test ! -x file当file不可执行时返回true 判断符号[] []与test用法几乎一模一样更常用于if语句中。另外[[]]是[]的加强版支持的特性更多。例如[ 2 -lt 3 ] # 为真返回值为0 echo \)? # 输出上个命令的返回值输出0 acs9e0ebfcd82d7:$ ls # 列出当前目录下的所有文件 homework output.txt test.sh tmp acs9e0ebfcd82d7:\( [ -e test.sh ] echo exist || echo Not exist exist # test.sh 文件存在 acs9e0ebfcd82d7:~\) [ -e test2.sh ] echo exist || echo Not exist Not exist # testh2.sh 文件不存在 注意[]内的每一项都要用空格隔开 中括号内的变量最好用双引号括起来 中括号内的常数最好用单或双引号括起来 例如nameacwing yxc [ \(name acwing yxc ] # 错误等价于 [ acwing yxc acwing yxc ]参数太多 [ \)name acwing yxc ] # 正确 判断语句 if…then形式 类似于C/C中的if-else语句。单层if 命令格式if condition then语句1语句2… fi 示例a3 b4if [ \(a -lt \)b ] [ \(a -gt 2 ] thenecho \){a}在范围内 fi 输出结果3在范围内 单层if-else 命令格式if condition then语句1语句2… else语句1语句2… fi 示例a3 b4if ! [ \(a -lt \)b ] thenecho \({a}不小于\){b} elseecho \({a}小于\){b} fi 输出结果3小于4 多层if-elif-elif-else 命令格式if condition then语句1语句2… elif condition then语句1语句2… elif condition then语句1语句2 else语句1语句2… fi 示例a4if [ \(a -eq 1 ] thenecho \){a}等于1 elif [ \(a -eq 2 ] thenecho \){a}等于2 elif [ \(a -eq 3 ] thenecho \){a}等于3 elseecho 其他 fi 输出结果其他 case…esac形式 类似于C/C中的switch语句。命令格式case \(变量名称 in值1)语句1语句2...;; # 类似于C/C中的break值2)语句1语句2...;;*) # 类似于C/C中的default语句1语句2...;; esac 示例a4case \)a in1)echo \({a}等于1;; 2)echo \){a}等于2;; 3) echo \({a}等于3;; *)echo 其他;; esac 输出结果其他循环语句 for…in…do…done 命令格式for var in val1 val2 val3 do语句1语句2... done 示例1输出a 2 cc每个元素一行for i in a 2 cc doecho \)i done 示例2输出当前路径下的所有文件名每个文件名一行for file in ls doecho \(file done 示例3输出1-10for i in \)(seq 1 10) doecho \(i done 示例4使用{1..10} 或者 {a..z}for i in {a..z} doecho \)i done for ((…;…;…)) do…done 命令格式for ((expression; condition; expression)) do语句1语句2 done 示例输出1-10每个数占一行for ((i1; i10; i)) doecho \(i done while…do…done循环 命令格式while condition do语句1语句2... done 示例文件结束符为Ctrld输入文件结束符后read指令返回false。while read name doecho \)name done until…do…done循环 当条件为真时结束。命令格式until condition do语句1语句2… done 示例当用户输入yes或者YES时结束否则一直等待读入。until [ \({word} yes ] || [ \){word} YES ] doread -p Please input yes/YES to stop this program: word done break命令 跳出当前一层循环注意与C/C不同的是break不能跳出case语句。示例while read name dofor ((i1;i10;i))docase \(i in8)break;;*)echo \)i;;esacdone done 该示例每读入非EOF的字符串会输出一遍1-7。 该程序可以输入Ctrld文件结束符来结束也可以直接用Ctrlc杀掉该进程。continue命令 跳出当前循环。示例for ((i1;i10;i)) doif [ expr \(i % 2 -eq 0 ]thencontinuefiecho \)i done 该程序输出1-10中的所有奇数。死循环的处理方式 如果AC Terminal可以打开该程序则输入Ctrlc即可。否则可以直接关闭进程使用top命令找到进程的PID 输入kill -9 PID即可关掉此进程 函数 bash中的函数类似于C/C中的函数但return的返回值与C/C不同返回的是exit code取值为0-2550表示正常结束。如果想获取函数的输出结果可以通过echo输出到stdout中然后通过\((function_name)来获取stdout中的结果。函数的return值可以通过\)?来获取。命令格式[function] func_name() { # function关键字可以省略语句1语句2… } 不获取 return值和stdout值 示例func() {nameyxcecho Hello \(name }func 输出结果Hello yxc 获取 return值和stdout值 不写return时默认return 0。示例func() {nameyxcecho Hello \)namereturn 123 }output\((func) ret\)?echo output \(output echo return \)ret 输出结果output Hello yxc return 123 函数的输入参数 在函数内\(1表示第一个输入参数\)2表示第二个输入参数依此类推。注意函数内的\(0仍然是文件名而不是函数名。示例func() { # 递归计算 \)1 (\(1 - 1) (\)1 - 2) … 0wordwhile [ \({word} ! y ] [ \){word} ! n ]doread -p 要进入func(\(1)函数吗请输入y/n worddoneif [ \)word n ]thenecho 0return 0fi if [ \(1 -le 0 ] thenecho 0return 0fi sum\)(func \((expr \)1 - 1))echo \((expr \)sum \(1) }echo \)(func 10) 输出结果55 函数内的局部变量 可以在函数内定义局部变量作用范围仅在当前函数内。可以在递归函数中定义局部变量。命令格式local 变量名变量值 例如#! /bin/bashfunc() {local nameyxcecho \(name } funcecho \)name 输出结果yxc第一行为函数内的name变量第二行为函数外调用name变量会发现此时该变量不存在。 exit命令 exit命令用来退出当前shell进程并返回一个退出状态使用\(?可以接收这个退出状态。exit命令可以接受一个整数值作为参数代表退出状态。如果不指定默认状态值是 0。exit退出状态只能是一个介于 0~255 之间的整数其中只有 0 表示成功其它值都表示失败。示例创建脚本test.sh内容如下#! /bin/bashif [ \)# -ne 1 ] # 如果传入参数个数等于1则正常退出否则非正常退出。 thenecho arguments not validexit 1 elseecho arguments validexit 0 fi 执行该脚本acs9e0ebfcd82d7:$ chmod x test.sh acs9e0ebfcd82d7:\( ./test.sh acwing arguments valid acs9e0ebfcd82d7:~\) echo \(? # 传入一个参数则正常退出exit code为0 0 acs9e0ebfcd82d7:~\) ./test.sh arguments not valid acs9e0ebfcd82d7:\( echo \)? # 传入参数个数不是1则非正常退出exit code为1 1文件重定向 每个进程默认打开3个文件描述符stdin标准输入从命令行读取数据文件描述符为0 stdout标准输出向命令行输出数据文件描述符为1 stderr标准错误输出向命令行输出数据文件描述符为2 可以用文件重定向将这三个文件重定向到其他文件中。重定向命令列表 命令 说明 command file 将stdout重定向到file中 command file 将stdin重定向到file中 command file 将stdout以追加方式重定向到file中 command n file 将文件描述符n重定向到file中 command n file 将文件描述符n以追加方式重定向到file中 输入和输出重定向 echo -e Hello \c output.txt # 将stdout重定向到output.txt中 echo World output.txt # 将字符串追加到output.txt中read str output.txt # 从output.txt中读取字符串echo \(str # 输出结果Hello World 同时重定向stdin和stdout 创建bash脚本#! /bin/bashread a read becho \)(expr \(a \)b) 创建input.txt里面的内容为3 4 执行命令acs9e0ebfcd82d7:\( chmod x test.sh # 添加可执行权限 acs9e0ebfcd82d7:~\) ./test.sh input.txt output.txt # 从input.txt中读取内容将输出写入output.txt中 acs9e0ebfcd82d7:\( cat output.txt # 查看output.txt中的内容 7 引入外部脚本 类似于C/C中的include操作bash也可以引入其他文件中的代码。语法格式. filename # 注意点和文件名之间有一个空格或source filename 示例 创建test1.sh内容为#! /bin/bashnameyxc # 定义变量name 然后创建test2.sh内容为#! /bin/bashsource test1.sh # 或 . test1.shecho My name is: \)name # 可以使用test1.sh中的变量 执行命令acs9e0ebfcd82d7:\( chmod x test2.sh acs9e0ebfcd82d7:~\) ./test2.sh My name is: yxc 转载自acwingyxc