Linux脚本攻略(1)——小试牛刀

终端打印
$echo “welcome to onezone.com.cn”
查看进程运行时环境变量 $
cat /proc/$PID/environ
使用pgrep获取进程ID $pgrep gedit
变量赋值、打印 $var
=”value” $echo $var PATH环境变量查看、设置 $echo $PATH export PATH=”$PATH:” 获取字符串长度 $var=1234567 $echo ${#var} 查看当前shell类型 $echo $SHELL 查看环境变量UID得到用户ID,root用户ID为0, $echo $UID 修改shell提示字符,通过设置环境变量PS1完成 使用命令cat ~/.bashrc |grep PS1 列出设置PS1的那一行: $cat ~/.bashrc |grep PS1 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' 设置新的提示符 viidiot@ubuntu:~$ PS1="linux-code#" linux-code# Shell执行算术运算 使用let时,变量前不用加$ #! /bin/bash N1=2 N2=3 let N1++ let N2++ let N=N1+N2 echo $N let N+=6 echo $N 执行一些高级运行,需要用到bc,如浮点计算、平方根、幂等 linux-code#echo "4 * 0.23" | bc .92 linux-code#let N=100 linux-code#echo "sqrt($N)" | bc 10 linux-code#echo "$N^2" | bc 10000 文件描述符与重定向,Linux中一切皆文件。 最常用的三个文件描述符 0——stdin (标准输入) 1——stdout (标准输出) 2——stderr (标准错误) 将文本重定向到文件 linux-code#echo "hello,linux-code 1" >tmp.txt linux-code#echo "hello,linux-code 2" >>tmp.txt linux-code#cat tmp.txt hello,linux-code 1 hello,linux-code 2 注意:> 和 >>都会将文本重定向到文件中,但是>会先清空文件中内容再写入,而>>会追加到文件尾部 将错误信息重定向到文件: 错误的使用ls命令 linux-code#ls nonfile ls: cannot access nonfile: No such file or directory 执行错误命令,将错误信息重定向到error.txt,终端上将没有任何输出 linux-code#ls nonfile 2>error.txt 查看error.txt中的内容,发现错误信息被写入文件error.txt linux-code#cat error.txt ls: cannot access nonfile: No such file or directory 将文本信息重定位的设备/dev/null,/dev/null为以特殊的设备文件,相当于一个黑洞。放到里面的东西会全部被丢弃。 linux-code#ls nonfile 2>/dev/null 管道命令 | |前面的命令的输出作为|后面命令的输出。 linux-code#cat printf.sh | grep "Jeff" printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564 几个实例: 1.格式化打印 #!/bin/bash #Filename: printf.sh printf "%-5s %-10s %-4s\n" No Name Mark printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456 printf "%-5s %-10s %-4.2f\n" 2 James 90.9989 printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564 2.变量使用 #!/bin/bash #Filename :variables.sh fruit=apple count=5 echo "We have $count ${fruit}(s)" 3.进制转换 #!/bin/bash #Desc: Number conversion no=100 echo "obase=2;$no" | bc 4.输入输出重定向 #!/bin/bash #从标准输入中读入,直到遇到EOF,停止读取,并将读取内容重定向到log.txt cat<<EOF>log.txt LOG FILE HEADER This is a test log file Function: System statistics EOF 5.密码读取 #!/bin/sh #Filename: password.sh echo -e "Enter password: " stty -echo #禁用终端回显 read password stty echo #启用终端回显 echo echo Password read. 6.在脚本中生成延时 #!/bin/bash #Filename: sleep.sh echo -n Count: tput sc #存储光标位置 count=0; while true; do if [ $count -lt 40 ]; then let count++; sleep 1; tput rc #恢复光标位置 tput ed #清除从当前光标位置到行尾所以内容 echo -n $count; else exit 0; fi done 7.脚本调试 使用-x选项,启动跟踪调试脚本如: $bash -x script.sh 几个启用禁用调试打印命令 Set -x:在执行时显示参数和命令 Set +x:禁止调试 Set -v:当命令进行读取时显示输入 Set +v:禁止打印输入 #!/bin/bash #Filename: debug.sh for i in {1..6}; do set -x echo $i set +x done echo "Script executed" 上述脚本,会打印出-x和+x之间的echo $i的详细调试信息。 通过传递环境变量来建立调试功能。 #!/bin/bash function DEBUG() { [ "$_DEBUG" == "on" ] && $@ || : } for i in {1..10} do DEBUG echo $i done 在每一个需要打印调试信息的语句前加一个DEBUG ,如果没有把_DEBUG= on传递给脚本,则不会打印调试信息。 使用如下语句将_DEBUG= on传递给脚本: $_DEBUG= on ./script.sh 8.获取命令执行的返回值 $?用于获取命令返回值 #!/bin/bash #Filename: success_test.sh CMD="cd /" #Substitute with command for which you need to test exit status $CMD if [ $? -eq 0 ]; then echo “$CMD executed successfully” else echo “$CMD terminated unsuccessfully” fi 9.内部分割符及迭代器 IFS:内部字段分隔符,经常用于文本数据处理。IFS的默认值为空白字符(空格、换行、制表符) #!/bin/bash #Desc: Illustration of IFS line="root:x:0:0:root:/root:/bin/bash" oldIFS=$IFS; IFS=":" #以分号作为内部分割符,从数据中获取用户名及其shell count=0 for item in $line; do [ $count -eq 0 ] && user=$item; [ $count -eq 6 ] && shell=$item; let count++ done; IFS=$oldIFS echo $user\'s shell is $shell; 10.Shell中循环语句 while循环结构: while [ condition ] do commands; done 实例: #! /bin/sh i=0 while [ $i -lt 10 ] do echo $i let i++ done for循环结构: for var in list; do commands; done
实例: #! /bin/sh arr=("hello" "linux-code" 1 2 3 4) for var in ${arr[@]}; do echo $var; done until 循环结构: until [ condition]; do commands; done 实例: #! /bin/sh x=0 until [ $x -eq 3 ]; do let x++; echo $x; done

你可能感兴趣的:(linux)