linux shell脚本攻略(一)

文章目录

  • linux脚本攻略第一章
    • 终端打印
      • echo命令
      • printf命令
      • 其他注意事项
    • 变量
    • 数学运算
      • let命令
      • []和(())操作
      • bc运算
    • 重定向
    • 数组
    • 别名
    • 终端信息
    • 日期相关
    • 调试脚本
    • 函数和参数
    • 管道命令
    • 字段分隔符和迭代器
    • 循环
    • 算术比较
    • 文件系统相关测试
    • 字符串比较


linux脚本攻略第一章

终端打印

echo命令

  • echo加上需要打印的字符。可以将该打印的字符串用单引号或者双引号引起来,也可以直接接该字符串。如echo hello worldecho 'hello world'echo "hello world"
  • 如果是转义字符,双引号引起来的字符串需要用转义字符。如echo "hello world\!"
  • 使用不带引号的echo时,不能显示;;用来表示分割命令。
  • 变量替换在单引号中无效。比如echo '$hello',直接输出'$hello'而不是hello表示的变量。
  • echo命令会自动换行。

printf命令

  • printf和c语言的printf函数一样,并且后面使用引用文本或由空格分割的参数。
  • 可以使用格式化字符串,也可以指定字符串宽度、左右对齐方式等。
  • 需要手动添加自动换行符,才会换行。
  • 示例如下。printf "hello world"输出hello worldprintf "%-5s %-10s %-4s\n" No Name Mark显示No Name Mark

其他注意事项

  • 使用echo和printf的命令选项时,要确保选项应该在命令行内所有字符串前,否则Bash会将其视为另一个字符串。
  • 如果需要忽略掉echo命令自动添加的换行符,则需要添加-n
  • 使用\e[1;%dm来设置颜色。黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47,重置=0。重置也可以用\e[0m来将颜色重新置回。

变量

  • 替换tr str1 str2
  • var=value进行赋值,不能使用var = value,这个语句是用来做判断的。
  • 访问变量有两种方式 $var${var}。如echo $var
  • 环境变量是从父进程(可以是整个操作系统)中继承而来的变量,用export来设置环境变量。
  • 添加PATH变量可以用export PATH="$PATH:/home/user/bin"
  • 单引号没办法访问变量以及为变量赋值。
  • length=${#var}获取变量var所代表的变量的长度。
  • 识别当前所用shell,echo $SHELLecho $0
  • 查看当前用户是否是Root。$UID如果是0则是root用户,否则不是。
  • 设置Bash提示字符串,在~/bashrc文件中修改PS1="str"str则为终端提示字符串,也可以使用特殊字符扩展成系统参数。如\u为用户名,\h为主机名,\w表示当前工作目录。
  • eval能够二次扫描,即现将后面的命令能够替换的先替换完之后再执行替换后的命令。
  • {parameter:+expression}如果parameter有值且不为空则使用expression的值。

数学运算

let命令

  • no1=4;no2=5;let result=no1+no2;echo $result;结果打印为9。
  • let no1++no1自加1、let no1--no1自减1、let no1+=6为no1加6。

[]和(())操作

  • result=$[ no1 + no2 ]让no1+no2,并将结果赋值给result。也可以在变量前加上 , 如 ‘ r e s u l t = ,如`result= result=[ $no1 + $no2 ]`。
  • 使用(())也可以做运算。如result=$(( no1 + 50 ))result=$(( $no1 + 50 ))

bc运算

  • 可以使用echo "4 * 0.56" | bc这种管道命令来计算表达式,或者把需要计算的运算放到文件里,然后调用bc filename,或者直接在命令行输入bc命令,再执行计算式。bc会自动显示结果不需要再加一个输出。
  • 可以通过使用scale=2来表示小数点精度,该表达式表示将小数位个数设置为2。可以使用obase=8来表示进制。如echo "scale=2;3/8" | bc
  • 可以计算特殊的一些函数或者运算,如sqrt(100)计算开平方,10^10计算10的10次。

重定向

  • 文件描述符0表示标准输入,1表示标准输出,2表示标准错误。
  • echo "This is a sample text 1" > temp.txt会将temp.txt中的数据清空,然后将This is a sample text 1输入到temp.txt文件中。>表示清空再加,>>表示在原有文件基础上追加内容(即不清除)。
  • cat filename查看文件内容。
  • 当一个命令发生错误并退回时会返回一个非0的退出状态,而成功完成的话会返回0,退出状态可以使用变量$?来访问。$?记录最近一次错误状态代码。
  • >>>加上1表示标准输出,加上2表示标准错误。如ls + 2> err.txt
  • 当重定向文件/dev/null时相当于将输出放到windows的垃圾桶一样。
  • 2>&1&>表示将标准错误转换成标准输出。
  • cat a* | tee out.txt | cat -n tee会将cat a*的结果放到out.txt中,并备份一份结果给cat -n处理。tee -a filename表示追加方式。
  • /dev/stderr表示标准错误文件,/dev/stdout表示标准输出文件,/dev/stdin表示标准输入文件,-也表示标准输入文件。
  • 将文件重定向到命令cmd < file
  • cat<log.txt会将后面输入的字符串都写入到log.txt中直到输入一行独立的str(str不写入文件)。
  • 创建一个文件描述符进行文件读取。exec 3表示3操作会将input.txt中的数据作为标准输入,则cat <&3则会把imput.txt中的数据打印出来(不能省略&)。

数组

  • 定义数组array_var=(1 2 3 4 5 6)表示声明一个数组array_var,并且有元素1,2,3,4,5,6。或者用array_var[index]="str"来赋值,如array_var[0]="test1"
  • 打印数组数据。echo ${array_var[0]}打印单个值,echo ${array_var[*]}打印所有值。
  • 可以使用declare -A ass_array来定义关联数组,使用ass_array=([index1]=val1 [index2]=val2)ass_array[index]=val来赋值。
  • 通过echo ${!array_var[*]}${!array_var[@]}来获取数组索引(下标默认从0开始)。

别名

  • 可以按照alias new_command='command sequence'。如为安装命令apt-get install创建别名:alias install='sudo apt-get install'
  • alias命令作用只是暂时的,一旦关闭当前终端,所有设置别名就失效了。为了使别名设置一直保持作用,可以将它放入~./bashrc文件中。如果需要删除别名,使用unalias命令alias example=
  • \command可以忽略当前定义的别名。

终端信息

  • 获取终端的行号和列数。tput colstput line
  • 打印出当前终端名。tput longname
  • 将光标移动到坐标(100, 100)处。tput cup 100 100
  • 设置终端背景色。tput setb n,n可以在0到7之间取值。同理设置终端前景色tput setf n
  • 设置文本样式为粗体。tput bold
  • 设置下划线的起止。tput smul设置下划线起始,tput rmul设置下划线终止。

日期相关

  • 在类Unix系统中,日期被存储成一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起所流逝的秒数,这种计时方式称为纪元时或Unix时间。
  • 读取日期一般为datedata +%s打印纪元时。
  • date --date "Thu Nov 18 08:07:21 ist 2010" +%s将字符串时间Thu Nov 18 08:07:21 ist 2010打印成纪元时时间。
  • 用格式串结合+作为date命令的参数,用来按照你的选择打印出对应格式的日期。后面一般加%Y%d%B%s%A等。例子如:date "%d %B %Y"打印20 May 2010
  • 设置日期和时间。date -s "格式化的日期字符串"
  • 相关日期格式如下表:
日期内容 格式
星期 %a(例如:Sat)、%A(例如:Saturday)
%b(例如Nov)、%B(例如:November)
%d(例如31)
固定格式日期 %D(例如:10/18/10)
%y(例如:10)、%Y(例如2010)
小时 %I或%H(例如:08)
分钟 %M(例如33)
%S(例如10)
纳秒 %N(例如695208515)
Unix纪元时 %s(例如:1290049486)

调试脚本

  • 使用-x来启动shell脚本的跟踪调试功能,如bash -x script.shsh -x script,会打印出所执行的每一行命令以及当前状态。
  • 也可以使用set -xset +x来对部分脚本进行调试。如
#!/bin/bash
for i in {1..6};
do
	set -x
	echo $i
	set +x
done
echo `Script executed`

只会打印出echo $i的调试信息。

  • set -x:执行时显示参数和命令。
  • set +x:禁止调试。
  • set -v:当命令进行读取时显示输入。
  • set +v:禁止打印输入。
  • #!/bin/bash改为#!/bin/bash -xv也可以进行调试。

函数和参数

  • 定义函数
function fname()
{
	statements;
}

fname()
{
	statements;
}
  • 调用函数时直接使用fname;,传递参数时直接fname arg1 arg2;
  • $1是第一个参数,$2是第二个参数,依此类推。
  • “$@“被扩展为”$1” "$2"等。
  • "$*“被扩展为”$1c$2c$3"等,其中c为IFS的第一个字符。
  • 导出函数。从父进程导出函数到子进程中。export -f fname

管道命令

  • 可以通过cmd_output=$(COMMANDS)或者cmd_output=`COMMANDS` 来进行读取由管道相连的命令序列的输出。如cmd_output=$(ls | cat -n); echo $cmd_output
  • ()可以定义一个子shell。当命令在子shell中执行时,不会对当前shell有任何影响,所有改变仅限于子shell中,并且可以通过引用子shell的方式保留空格和换行符。
  • read -n number_of_chars variable_name从 输入中读取n个字符并存入变量variable_name。
  • 用无回显的方式读取密码。read -s var,即输入的字符串不会显示出来。
  • read -p "Enter input:" varEnter input:为提示信息。
  • read -t timeout var。在限定时间内输入,如read -t 2 var
  • read -d delim_char var。输入直到遇到定界符才结束。如read -d ":" var

字段分隔符和迭代器

  • 内部字段分隔符是存储定界符的环境变量,它是当前shell环境使用的默认定界字符串。

循环

  • for循环。
for var in list;
do 
	commands;
done

for((i=0; i<10; i++))
{
	commands;
}
  • while循环。
while condition
do
	commands;
done
  • until循环
until condition
do
	commands;
done

算术比较

  • -gt:大于。
  • -lt:小于。
  • -ge:大于或等于。
  • le:小于或等于。
  • -eq:等于。
  • -nq:不等于。
  • -a:逻辑与。
  • -o:逻辑或。

文件系统相关测试

  • -f $file_var:如果给定的变量包含正常的文件路径或文件名,则返回真。
  • -x $var:如果给定的变量包含的是可执行文件,则返回真。
  • -d $var:如果给定的变量包含的是目录,则返回真。
  • -e $var:如果给定的变量包含的文件存在,则返回真。
  • -c $var:如果给定的变量包含的是一个字符设备文件的路径,则返回真。
  • -b $var:如果给定的变量包含的是一个块设备文件的路径,则返回真。
  • -w $var:如果给定的变量包含的文件可写,则返回真。
  • -r $var:如果给定的变量包含的文件可读,则返回真。
  • -L $var:如果给定的变量包含的是一个符号链接,则返回真。

字符串比较

  • [[ $str1 = $str2 ]]。判断两个字符串相等。
  • [[ $str1 == $str2 ]]。判断两个字符串相等。
  • [[ $str1 != $str2 ]]。判断两个字符串不相等。
  • [[ $str1 > $str2 ]]。判断str1大于str2。
  • [[ $str1 < $str2 ]]。判断str1小于str2。
  • [[ -z $str ]]。判断str是否是空字符串。
  • [[ -n $str ]]。判断str是否是非空字符串。

你可能感兴趣的:(shell)