echo -e "\003[背景颜色;文字颜色;显示方式m字符串\003[0m"
echo -e "\033[40;31;5mSomething string\033[0m"
覆盖和追加模式不要应用于系统文件
cat >> tmp.txt << EOF
> xxxx
> xxx
> EOF
cp /etc/passwd{,.bak}
一、小知识
1.1. 测试脚本及echo
shell 输出带颜色内容
shell教程
一篇教会你写90%的shell脚本
-
简单示例1
#!/bin/bash # ----------------------------------- # Filename: hello.sh # Version: 1.1 # Date: 2017/06/01 # Author: wang # Email: wang@gmail.com # Website: www.magedu.com # Description: This is test example # Copyright: anyu967 # License: GPL # ----------------------------------- # -e,转义; # -n,不换行; # 变量名前不加$,不能有空格 echo "Hello World" your_name="anyue967" bash -x file.sh # 单步检测脚本 bash -n file.sh # 检查语法错误 -
简单示例2
# 定义: arrName=(value1 value2 ... n) array_name=(value0 value1 value2) array_name[0]=value0 # 引用数组 echo "数组元素: ${array_name[@]}" echo "数组元素: ${array_name[*]}" echo "数组元素个数为: ${#array_name[*]}" # read #!/bin/bash read -p "input a val:" a read -p "input a val:" b c=$(($a+$b)) # $((exp)) c=$[$a+$b] # $[exp] let c=$a+$b # let exp c=expr $a + $b # expr 算数表达式 echo "result=${r}" var="http://www.runoob.com/linux/linux-shell-variable.html" s1=${var#*/} # /www.runoob.com/linux/linux-shell-variable.html 表示从左边删除到第一个指定的字符 s2=${var##*/} # linux-shell-variable.html 表示从左边删除到最后一个指定的字符 s3=${var%%.*} # http://www %表示从右边删除到第一个指定的字符; %%表示从右边删除到最后一个指定的字符
1.2. 变量
| 符号 | 说明 |
|---|---|
(var=value) |
单独使用()会产生一个子shell |
`cmd` 或 $(cmd) |
子shell中执行 |
(( expression )) |
算数:整数扩展、运算符、重定义变量值、算数运算比较 |
[[ expression ]] |
支持数学运算,支持逻辑测试:&& || |
${var} |
引用变量(引用变量时, 变量名前要加$, 建议变量名外加{}, 一种习惯) |
$[ operation ] |
支持数学运算 $[ $var1 * ($var2 - $var3) ] |
$? 或 exit code |
退出状态,惯例成功状态码为0,异常结束是一个正整数 |
test condition |
关键字 test condition,文件 整数 字符串 |
[ expression ] |
支持文件、整数、字符串比较:== !=;逻辑测试使用:-a -o ! |
$0 $# $* $@ $$ $? |
文件名;参数个数;"$1 $2 ... $n";"$1" "$2" "$3";当前shell的PID;上个命令的退出状态,或函数的返回值 |
myarry(var1 var2 var3 var4) |
数组:${myarry[i]} |
command |
shell的内建命令 |
shift |
位置参数可以用shift命令左移,不带参数相当于shift 1 |
二、流程控制
选择
-
示例1
#!/bin/bash a=10 b=20 if [[ $a -lt 100 && $b -gt 100 ]]; then echo "返回 true" else echo "返回 false" fi if [[ $a -lt 100 || $b -gt 100 ]]; then echo "返回 true" else echo "返回 false" fi #!/bin/bash ratio = $(df -h |grep /dev/sda3 |awk '{print $5}' |cut -d "%" -f1) if [ "$ratio" -ge 80 ]; then echo "钉钉报警!" fi -
示例2
#!/bin/bash ntpdate asia.pool.ntp.org &>/dev/null date = $(date +%Y%m%d) size = $(du -sh /var/lib/mysql) if [ -d /tmp/dbbak ]; then echo "Date: $date!" >/tmp/dbbak/dbinfo.txt echo "Date: $size!" >>/tmp/dbbak/dbinfo.txt cd /tmp/dbbak tar -czf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null rm -rf /tmp/dbbak/dbinfo.txt else mkdir /tmp/dbbak echo "Date: $date!" >/tmp/dbbak/dbinfo.txt echo "Date: $size!" >>/tmp/dbbak/dbinfo.txt fi #!/bin/bash port = `nmap -sT 192.168.137.129 |grep tcp |grep http |awk '{print $2}'` if [ "$port" == "open"]; then echo "$(date) httpd is ok!" >>/tmp/autostart-acc.log else /etc/init.d/httpd start &>/dev/null echo "$(date) restart ok!" >>/tmp/autostart-acc.log fi
循环
-
for-do-done
# for-do-done #!/bin/bash user=$(cat /etc/passwd |grep "/bin/bash" |grep -v "root" |cut -d ":" -f1) for i in $user do userdel -r $i done -
while-do-done
# while-do-done #!/bin/bash while [ $i -le 100 ] do s = $(( $s + $i )) i = $(( $i + $1 )) done echo "The sum is: $s" -
case-in-esac
#!/bin/bash echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
函数
- 示例
funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !"
三、例子
执行方式:
<<'comment'
....
comment
:'
comment1
comment2
'
# 内建命令不需要产生子进程 内建命令对当前shell生效
bash demo.sh # 在子进程中执行命令,不对当前产生影响
./demo.sh # 同上,但需要执行权限
source demo.sh # 不产生子进程,执行完成对当前产生影响
. demo.sh # 同上
# /etc/profile ==》 ~/.bash_profile ==> ~/.bashrc ==> /etc/bashrc
# /home/xy/bak/1.sh
# /home/xy source ./bak/1.sh
echo "${BASH_SOURCE[0]}" # ./bak/1.sh 取当前执行的 shell 文件所在的路径及文件名
echo "${BASH_SOURCE}" # ./bak/1.sh
echo "$(dirname "${BASH_SOURCE[0]}")" # ./bak
DIR="$(cd "$(dirname ${BASH_SOURCE[0]})" && pwd)" # /home/xy/bak
echo $DIR
本文来自博客园,作者:anyu967,转载请注明原文链接:https://www.cnblogs.com/anyu967/articles/17343663.html
浙公网安备 33010602011771号