一,打印输出
1,再echo 中转义换行符
echo - e "1\t2\t3"
2 打印彩色输出
echo -e "\e[1;31m This is red text \e[0m"
要设置彩色背景,经常使用的颜色色吗是:重置 =0,黑色 = 40,红色 = 41,绿色 =42 ,黄色 = 43 ,洋色 = 35 ,青色 = 36 ,白色 =47
3,printf
printf "%-5s %-10s %-4.2f\n" 1 sarath 80.323
打印结果
1 sarath 80.32
%-5 指明了一个格式为左对齐且宽度为5的字符串替换(-表示左对齐)。如果不用,字符串则采用右对齐形式。 .2 指定保留2个小数位。
二,玩转变量和环境
假设firefox 开启中,使用命令pgrep firefox 查询PID
cat /proc/12501/environ
使用上述命令获取与该进程相关的环境变量。每一个变量以name=value 的形式来描述,彼此之间由null 字符串(\0)分隔。如果你将\0 替换成\n ,那么就可以将输入重新格式化,使得每一行显示一组 “变量=值”。替换命令可以使用tr 命令来实现
cat /proc/3223/environ | tr '\o' '\n'
4,变量赋值
var=value
注意的是:var = value 不同于 var=value 前者是赋值,后者是相等操作。
在变量之前加上$ 可以打印出变量的内容
var="value"
echo $var
或者
echo ${var}
也可在printf 或 echo 命令的双引号中引用变量值
fruit=apple
count=5
echo "we have $count ${fruit}"
5,添加环境变量
HTTP_PROXY=192.168.23.3128
export HTTP_PROXY
export 命令用来设置环境变量。
6,补充内容
>获取字符串长度
var=123458
echo $(#var)
</pre><pre code_snippet_id="1964172" snippet_file_name="blog_20161107_8_1284788" name="code" class="php">
<pre name="code" class="php">#!/bin/bash
var=123456
length=${#var}
echo $length
>识别当前使用的shell
echo $SHELL
7,检查是否为超级用户
UID是一个重要的环境变量,可以用于检查当前脚本是以超级用户还是普通用户的身份运行的。
root用户的UID是0;
8,数学运算
在bash shell环境中,可以利用let,(()) 和 [] 执行基本的算术操作。而在进行高级操作时,expr 和 br这两个工具也非常有用。
>let 命令可以直接执行基本的算术操作。当使用let时,变量名之前不需要再添加$
#!/bin/bash
no1=4
no2=5
let result=no1+no2
echo $result;
操作符[]的使用方法和let命令类似
result=$[no1+no2]
在[]中也可以使用$前缀
result=$[ $no1+5]
也可以使用(())
result=$((no1+50))
bc 是一个用户数据运算的高级工具。
9,文件描述符以及重定向
文件描述符是与某个打开的文件或数据流相关的整数。文件描述符0,1,2是系统预留的。
就输出重定向而言>和>> 不相同。前者先清空,后者追加。
>将文件重定向到命令
借助重定向,我们可以像使用stdin那样从文件中读取数据
$cmd < file
command << delimiter 从标准输出中读入,直至遇到delimiter分界符
向log文件中写入头部数据。可以按照下面的方法完成
#!/bin/bash
cat<<EOF>log.txt
log file header
EOF
自定义文件描述符 读取
exec 3<input.txt
cat<&3
自定义文件描述符写入
exec 4>output.txt
echo newline >&4
追加
exec 5>>input.txt
实例:在脚本中生成延时
以循环的方式运行监视脚本。 使用tput 和sleep 从0开始计数到40
tput sc 存储光标的位置
tput rc 恢复光标的位置
tput ed 清除从当前光标位置到行尾之间的所有内容。
循环1秒钟,延时通过sleep 命令实现的。
#!/bin/bash
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
子shell
cmd_output=&(ls | cat -n)
echo $cmd_output
反引用
cmd_output=`COMMANDS`
子shell 本身就是独立的进场,可以使用()操作符来定义一个字shell
当命令在子shell 中执行时,不会对当前的shell 有任何影响;所有的改变仅限于shell内。