微信公众号:[猫十二的日常],欢迎留言和指出问题,深漂中的前端团子,猫十二的铲屎官,生活不止code,还有猫和你。
常见的命令
-
echo 用于输出
echo 'aymfx最帅' -
变量使用
your_name="aymfx" echo $your_name echo ${your_name} -
只读变量
myname="aymfx" echo $myname readonly myname myname="赋值不能出现空格" #myname: readonly variable echo $myname -
删除变量
myname="aymfx" echo $myname unset myname echo $myname # 没有输出 -
单引号
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
-
双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
myname="aymfx" str="hello \"$myname\"" echo $str hello "aymfx" -
获取字符串长度
string="aymfx" echo ${#string} #输出 5 -
提取子字符串
string="aymfx" echo ${string:1:3} #输出 ymf -
查找子字符串
-
在这种情况下使用“ expr”命令 只用在linux命令上
STRING="this is a string" SUBSTRING="hat" expr index "$STRING" "$SUBSTRING" # 1 is the position of the first 't' in $STRING
-
-
最短子串匹配
- ${string#substring}
- ${string%substring}
filename="bash.string.txt" echo ${filename#*.} #string.txt echo ${filename%.*} #bash.string -
最短子串匹配
- ${string##substring}
- ${string%%substring}
filename="bash.string.txt" echo "After deletion of longest match from front:" ${filename##*.} # txt echo "After deletion of longest match from back:" ${filename%%.*}# bash -
子串替换
-
用替换替换第一次出现的子字符串
str='to be or not to be' echo ${str[@]/be/cat} #to cat or not to be-
替换所有出现的子串
str='to be or not to be' echo ${str[@]//be/cat} #to cat or not to cat -
删除所有出现的子字符串(替换为空字符串)
str='to be or not to be' echo ${str[@]// not/} #to be or not to be
-
-
如果在$str开头替换子字符串的出现
str='to be or not to be' echo ${str[@]/#to be/eat now} #eat now or not to be -
如果在$str结尾,则替换子字符串的出现
str="to be or not to be" echo ${str[@]/%be/eat} # to be or not to eat
-
-
数组
-
初始化 (一个数组可以用一个名称保存多个值。数组命名与变量命名相同。 通过分配()中包含的以空格分隔的值来初始化数组)
apple=1 my_array=($apple banana "fruit basket" orange) echo ${#my_array[@]} #4 echo ${my_array[3]} #orange echo aymfx #aymfx echo ${my_array[0]} #1 -
数组成员不必是连续的或连续的。数组的某些成员可以保留为未初始化。
-
数组中元素的总数由$ {#arrayname [@]}引用
-
-
算术运算符
- a + b加法(a加b)
- a-b减(a减b)
- a * b乘法(a乘以b)
- a / b除法(整数)(a除以b)
- a%b取模(除以b的整数余数)
- a******b**取幂(a等于b的幂)
-
条件语句
#第一种 name='aymfx' if [ $name = 'aymfx' ];then echo "${name} 真帅" # aymfx 真帅 fi #第二种 name='aymfx' if [ $name = 'ly' ];then echo "${name} 真帅" # aymfx 真帅 else echo "没有比${name}再帅的了" fi #第三种 name='aymfx' if [ $name = 'ly' ]; then echo "${name} 真帅" # aymfx 真帅 elif [ $name = 'aymfx' ]; then echo "${name} 帅爆了" # aymfx 帅爆了 else echo "没有比${name}再帅的了" fi # 数值比较类型 comparison Evaluated to true when $a -lt $b $a < $b $a -gt $b $a > $b $a -le $b $a <= $b $a -ge $b $a >= $b $a -eq $b $a is equal to $b $a -ne $b $a is not equal to $b # 字符串比较的类型 comparison Evaluated to true when "$a" = "$b" $a is the same as $b "$a" == "$b" $a is the same as $b "$a" != "$b" $a is different from $b -z "$a" $a is empty # case mycase=1 case $mycase in 1) echo "You selected bash";; 2) echo "You selected perl";; 3) echo "You selected phyton";; 4) echo "You selected c++";; 5) exit esac=周围必须有空格 在字符串变量周围使用“”,以避免将特殊字符的shell扩展为*
-
循环结构
# for循环 # for for arg in [list] do command(s)... done #!/bin/bash names=(aymfx liya zhangmeng) for name in ${names[@]};do echo $name done # while while [ condition ] do command(s)... done COUNT=4 while [ $COUNT -gt 0 ];do echo "value of count ${COUNT}" COUNT=$(($COUNT-1)) done #bash直到循环 until [ condition ] do command(s)... done COUNT=1 until [ $COUNT -gt 5 ];do echo "value of count ${COUNT}" COUNT=$(($COUNT+1)) done NUMBERS=(951 402 984 651 360 69 408 319 601 485 980 507 725 547 544 615 83 165 141 501 263 617 865 575 219 390 237 412 566 826 248 866 950 626 949 687 217 815 67 104 58 512 24 892 894 767 553 81 379 843 831 445 742 717 958 609 842 451 688 753 854 685 93 857 440 380 126 721 328 753 470 743 527) for value in ${NUMBERS[@]};do if [ $value -eq 237 ]; then break; elif [ $(($value % 2)) == 0 ]; then echo $value fi done # break和continue可用于控制for,while和直到构造的循环执行。continue用于跳过特定循环迭代的其余部分,而break用于跳过整个循环的其余部分。 -
shell函数
- 函数调用等效于命令。通过在函数名称后面指定参数,可以将参数传递给函数。函数中的第一个参数称为 2等
function function_B { echo "Function B." } function function_A { echo "$1" } function adder { echo "$(($1 + $2))" } function_A "Function A." # Function A. function_B # Function B. adder 12 56 # 68
一些解释
-
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
- #! /bin/bash
-
运行脚本的方法
- chmod +x ./test.sh #使脚本具有执行权限
- ./test.sh #执行脚本
- /bin/sh test.sh
-
变量类型
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
-
命令输出的值
-
可以通过用``(称为反引号)或$()封装命令来完成替换
FILELIST=`ls` FileWithTimeStamp=/tmp/my-dir/file_$(/bin/date +%Y-%m-%d).txt
-
-
2引用第二个参数,依此类推。 变量$0引用当前脚本。
命令 sh auto.sh apple banner 执行后 echo $0 #auto.sh echo $1 #apple echo $# #2 -
特殊变量
$0-当前脚本的文件名|$n-调用传递给脚本的第N个参数或调用函数|$#-传递给脚本或函数的参数数量|$@-所有传递给脚本或函数的参数|$*-所有传递给脚本或函数的参数|$?-最后执行的命令的退出状态|$$-当前shell的进程ID。对于shell脚本,这是它们正在执行的进程ID.|$!-最后一个后台命令的进程号|
echo "Script Name: $0" function func { for var in $* do let i=i+1 echo "The \$${i} argument is: ${var}" done echo "Total count of arguments: $#" } func We are argument #Script Name: auto.sh #The $1 argument is: We #The $2 argument is: are #The $3 argument is: argument #Total count of arguments: 3 function func { echo "--- \"\$*\"" for ARG in "$*" do echo $ARG done echo "--- \"\$@\"" for ARG in "$@" do echo $ARG done } func We are argument #--- "$*" #We are argument #--- "$@" #We #are #argument -
常见信号类型
-
SIGINT:用户发送中断信号(Ctrl + C) -
SIGQUIT:用户发送退出信号(Ctrl + C) -
SIGFPE:尝试了非法的数学运算
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2
trap "echo Booh!" SIGINT SIGTERM echo "it's going to run until you hit Ctrl+Z" echo "hit Ctrl+C to be blown away!" while true do sleep 60 done trap booh 2 15 trap "rm -f folder; exit" 2 -
-
文件测试(通常,您将需要对正在运行的文件系统进行一些文件测试。在这种情况下,shell将为您提供一些有用的命令来实现它。)
-
-<command> [filename] -
[filename1] -<command> [filename2]#使用“ -e”测试文件是否存在 #!/bin/bash filename="package.json" if [ -e "$filename" ]; then echo "$filename exists as a file" fi #使用“ -d”测试目录是否存在 directory_name="public" if [ -d "$directory_name" ]; then echo "$directory_name exists as a directory" fi #使用“ -r”测试文件是否对运行脚本/测试的用户具有读取权限 filename='README.md' if [ ! -f "${filename}" ];then touch "${filename}" fi if [ -r "${filename}" ];then echo 有可读权限 else echo 没有权限 fi
-
如果觉得我的文章还可以,点个赞或者关注一下下,还有精彩的故事等着你哦,还可以云撸猫