[关闭]
@songying 2018-11-06T20:39:27.000000Z 字数 4745 阅读 1031

shell之牛刀小试

linux


1. 终端打印

1. echo

1. 基本用法

  1. echo "hello world!"
  2. echo 'hello world!' #变量替换在单引号中无用
  3. echo hello world #此时无法使用“;”,因为";"为命令界定符
  1. echo -e "1\t2\t3" #-e 表接受双引号字符串内的转义序列作为参数
  2. # zsh中不需要添加 -e

2. 打印彩色输出

2. printf

  1. #%-5s指明一个格式为左对齐且宽度为5的字符串替换。
  2. printf "%-5s, %-10s %-4s\n" No Name Mark

注意 : 在prinf的每行后都要有一个换行符\n.

2. 玩转变量

1.基础知识:获取某个进程的环境变量

  1. pgrep gedit #获取gedit这个进程的进程ID
  2. #获取其运行时的环境变量,并将所有的\0换为\n
  3. cat /proc/$PID/environ | tr '\0' '\n'

2. 变量基本使用

  1. var="value" #注意没有空格
  2. echo $var
  3. echo ${var}
  1. #PATH常定义在/etc/environment 或/etc/profile或 ~/.bashrc中。
  2. export PATH="$PATH:/home/user/bin"

3. 获取变量值长度

  1. length=${#var} #获取变量值长度

4. 获知当前是哪种shell

  1. echo $SHELL echo $0

5. 判断当前脚本是以超级用户还是普通用户身份运行

  1. if [ $UID -ne 0 ]; then #root的UID是0
  2. echo Not root user.please run as root.
  3. else
  4. echo Root user
  5. fi

3. 使用函数添加环境变量

prepend()函数:首先检查该函数第二个参数所指定的目录是否存在,

若存在,eval表达式将第一个参数所指定的变量值设置为第二个参数值+":",随后再跟上首个参数的值

  1. #在.bashrc中添加
  2. prepend() { [ -d "$2" ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1 ; }
  3. # shell参数扩展:${parameter:+expression}:若parameter不为空,则使用expression的值。
  4. prepend PATH /opt/myapp/bin
  5. prepend LD_LIBRARY_PATH /opt/myapp/lib

4. 使用shell进行数学运算

  1. no1=4; #赋值

1. let

  1. #let变量名前不需要加$
  2. let result=no1+no2
  3. let no1++
  4. let no+=6

2. [ ]

  1. result=$[ no1 + no2 ]
  2. result=$[ $no1 + 5 ] #可加可不加$

3. (( ))

  1. result=$(( no1 + 50 ))
  2. result=$(( $no1 + 50 ))

4. expr

  1. result=`expr 3 + 4` #此处并非是单引号
  2. result=$(expr $no1 + 5)

5. bc: 执行浮点数运算并应用一些高级函数

  1. result=`echo "$no * 1.5" | bc` # 此处并非是单引号

1. 设置小数精度

  1. result=`echo "scale=2;3/8" | bc` #此处` `可换为$( )

2. 进制转换

  1. #将十进制转换为二进制
  2. result=$(echo "obase=2;$no" | bc)
  3. #将人禁止转换为十进制
  4. result=$(echo "obase=10;ibase=2;$no" | bc)

3. 计算平方与平方根

  1. result=`echo "sqrt(100)" | bc` # 计算平方根
  2. result=$(echo "10^10" | bc) #计算平方

5. 玩转文件描述符与重定向

1. 重定向符号

  1. > #将文本内容重定向到一个文件
  2. >> #将文本追加到目标文件中
  3. 2> #将stderr重定向到一个文件
  4. cmd 2> stderr.txt 1> stdout.txt #将stderr,stdout定向到不同文件
  5. cmd &> output.txt #将stderr,stdout定向到同一文件
  6. cmd 2> /dev/null #将stderr信息销毁

2. tee

6. 数组与关联数组

7. 别名:alias

  1. alias new_command='command sequence' # 创建别名,此处是单引号

注意: alias别名的作用是暂时的,一旦关闭终端,所有别名设置将消失。若想永久修改,可更改.basgrc配置文件。

8. 获取终端信息(此处没有深入)

输入密码时,不应显示内容

  1. #!/bin/bash
  2. echo -e "Enter password: "
  3. stty -echo # -echo禁止将输出发送到终端。
  4. read password
  5. stty echo
  6. echo
  7. echo password read.

9. 获取,设置日期和延时

10. 调试脚本

  1. bash -x script.sh # -x:打印出所执行的每一行命令以及当前状态

1. 对脚本进行部分调试

  1. #/bin/bash
  2. for i in {1..6};
  3. do
  4. set -x #在执行时显示参数与命令
  5. echo $i
  6. set +x #禁止调试
  7. done
  8. echo "Script executed"

2. 自定义格式显示调试信息:通过传递_DEBUG环境变量建立调试风格

  1. #!/bin/bash
  2. function DEBUG()
  3. {
  4. # ”:“表示告诉shell不要进行任何操作
  5. [ "$_DEBUG" == "on" ] && $@ || :
  6. }
  7. for i in {1..10}
  8. do
  9. # 在给每一个需要打印调试信息的语句前面加上DEBUG。
  10. DEBUG echo $i
  11. done
  12. 运行: _DEBUG=on ./script.sh

11. 函数和参数

  1. function fname(){ #定义函数
  2. //statement
  3. }
  4. fname ; #执行函数
  5. fname arg1 arg2 ; #传递参数

1. 参数的符号

  1. $1: 第一个参数
  2. $2: 第二个参数
  3. $n: n个参数
  4. $@: 扩展为"$1", "$2", "$3"
  5. $*: 扩展为"$1$2$3"

2. 递归函数

  1. function1() {
  2. echo $1;
  3. function1 hello;
  4. sleep 1;
  5. }

3.导出函数

  1. #函数作用域可扩展到子进程中
  2. export -f function_name

4. 读取命令或函数的返回值

  1. command;
  2. echo $?; # $?是上一个命令的返回值,成功=0, 不成功=非0.

5. 检查某个命令是否成功结束

  1. #!/bin/bash
  2. #command 中写入你要检测退出状态的目标命令
  3. CMD="command"
  4. $CMD
  5. if [ $? -eq 0 ]
  6. then
  7. echo "$CMD executed successfully"
  8. else
  9. echo "$CMD terminated unsuccessfully"
  10. fi

12. 管道:|

  1. ls | cat -n > out.txt
  2. #子shell
  3. cmd_output=$(ls | cat -n)
  4. echo $cmd_output
  5. #反引用,此处不是单引号
  6. cmd_output=`ls | cat -n`
  7. echo $cmd_output

1. 利用子shell生成一个独立进程

  1. pwd;
  2. (cd /bin; ls); # ()来定义一个子shell
  3. pwd;

注意: 当命令在子shell中执行时,不会对当前shell有任何影响,所有的改变仅限于子shell内部。

2. 通过引用子shell方式保留空格和换行符

  1. # 通过将子shell放入到双引号中可保留空格和换行符。
  2. output="$(cat text.txt)"

13. read: 从键盘或标准输入读取文本

1. 从输入中读取n个字符,并存入变量中

  1. #从标准输入中读取3个字符送入到var_name这个变量中。
  2. read -n 3 var_name

2. 用无回显的方式读取数据到变量中

  1. # 从标准输入中读取数据,但是不显示输入的数据,可用来读取密码
  2. read -s var_name

3. 显示提示信息

  1. # 显示提示信息,并将输入的数据吸入到变量中
  2. read -p "Enter input:" var

4. 在特定时限内读取输入

  1. #在十秒内将输入写到变量中
  2. read -t 10 var

5. 用特定定界符标志输入行的结束

  1. # 输入中一旦遇到:就停止输入,并将输入写入变量中。
  2. read -d ":" var

14. 自定义repeat() 函数:运行命令直至成功

  1. #该命令每30秒运行一次。
  2. repeat(){
  3. while :; do $@ && return; sleep 30; done
  4. }
  5. repeat wegt -c ......

15. IFS:内部字段分隔符

简介:

IFS是存储定界符的环境变量,是shell环境中使用的默认定界符。其默认值时空白字符,包括:换行符,制表符, 空格。

1. IFS的基本使用

  1. data="name,sex,rollno,location"
  2. oldIFS=IFS
  3. IFS=, #将定界符设置为逗号
  4. for item in $data;
  5. do
  6. echo Item: $item
  7. done
  8. IFS=oldIFS

2. 巧妙打印/etc/passwd中用户以及他们的shell

  1. #!/bin/bash
  2. line="root:x:0:0:root:/root:/bin/bash"
  3. oldIFS=$IFS;
  4. IFS=":"
  5. count=0
  6. for item in $line;
  7. do
  8. [ $count -eq 0 ] && user=$item;
  9. [ $count -eq 6 ] && shell=$item;
  10. let count++
  11. done
  12. IFS=$oldIFS
  13. echo "$user\'s shell is $shell;"

16. 循环结构

1. for循环

  1. # list可以是一个字符串,也可以时一个序列,注意此处的condition有逗号结尾
  2. for var in list;
  3. do
  4. comands;
  5. done
  6. # 序列: {1..50}, {a..z}, {A..Z}

2. while循环

  1. # true,可实现无限循环,注意此处的condition有逗号结尾
  2. while condition;
  3. do
  4. commands;
  5. done

3. until循环

  1. # 注意此处的condition有逗号结尾.
  2. until [ $x -eq 9];
  3. do
  4. let x++;
  5. echo $x;
  6. done

17. 比较与测试

1. if条件

  1. if condition;
  2. then
  3. commands;
  4. else
  5. commands;
  6. fi
  1. [ condition ] && action; #若condition为真,则执行action
  2. [ condition ] || action; #若condition为假,则执行action

2. 算术比较

注意: 一定在[ 或 ] 与操作数之间有一个空格

  1. [ var -eq 0 ] # 当 $var等于0时,返回真。
  2. [ var -eq 0 ] # 当 $var不为0时,返回假
  3. -gt :大于
  4. -lt :小于
  5. -ge :大于或等于
  6. -le :小于或等于
  7. [ $var1 -ne 0 -a $var2 -gt 2 ] #逻辑与-a,而不可用&&与&
  8. [ $var1 -ne 0 -o $var2 -gt 2 ] #逻辑或 -o,而不可用|| 与 |

3. 文件测试

  1. [ -f $var ] #若变量包含正常的文件路径或文件名,返回真
  2. [ -x $var ] #变量包含的文件可执行,返回真
  3. [ -d $var ] #变量包含的是目录,返回真
  4. [ -w $var ] #变量包含的文件可写,返回真
  5. [ -r $var ] #变量包含的文件可读, 返回真
  6. [ -L $var ] #变量包含的是一个符号链接,返回真
  7. [ -e $var ] #变量包含的文件存在,返回真。
  8. [ -c $var ] #变量包含的是一个字符设备文件路径,返回真
  9. [ -b $var ] #变量包含的是一个块设备文件路径,返回真

4. 字符串比较

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注