1.变量的设置规则
myname=SunnyPoem
name=”$myname” #name=SunnyPoem
nameA=’$myname’ #nameA=$myname
nameB=$(uname -r) #其他命令提供的信息
nameC=`uname -r`
nameD=”$name”abc #追加
nameD=${name}abc
echo $name #显示变量
unset name #取消变量
2. 环境变量的功能
env #查看环境变量
$ #本Shell的PID
? #上个执行的回传码0,上次执行成功
set #查看所有变量(含环境变量和自定义变量)
export #自定义变量转成环境变量
子进程仅会继承父进程的环境变量,不会继承父进程的自定义变量。
如果要让变量内容继续在子进程中使用,执行export 变量名称。
3. 管道命令(pipe)
“|”仅能处理经由前面一个命令传来的正确信息(standard output).
选取命令cut、grep.
cut 同一行数据进行分解(处理信息以行为单位)
cut -d ‘分隔符’ -f fields
cut -c 字符范围
echo $PATH | cut -d ‘:’ -f 3,5 #选出用‘:’分割的第3和第5field
eccho $PATH|cut -c 12- #第12字符后的所有字符串
grep 行中如果有我们需要的信息,将该行拿出来
grep [-acinv] [--color=auto] ‘查找字符串’ filename
-c:计算匹配的次数
-i:忽略大小写
-n:顺便输出行号
-v:方向选择
4. awk
awk以行为一次处理单位,以字段为最小处理单位。
读入一行,并将一行的数据填入$0(一整行),$1(第一列)等变量中
依据条件,判断是否执行后面的动作
做完所有的条件及动作
若有后续的行,重复上面三个动作
awk ‘条件1{动作1} 条件2{动作2}’
内置变量:
NF:每一行($0)拥有的字段总数(列数)
NR:目前awk处理第几行数据
FS:目前的分隔符(默认空格键)
条件:逻辑运算符
BEGIN:预先设置awk的变量
cat /etc/passwd | awk ‘BEGIN{FS=”:”} $3 < 10 {print $1 “\t ” $3}’
5. 正则表达式
TODO
6. 数据流重定向
数据重定向可以将标准输出和标准错误输出分别传送到其他的文件或设备中去。
标准输入:代码为0,使用< 或<<(结束条件)
find /home -name .bashrc >list 2>list_error
find /home -name .bashrc 2>/dev/null (错误信息忽略不存储)
find /home -name .bashrc >list 2>&1 (标准输出和标准错误都重定向到list中)
find /home -name .bashrc &>list(标准输出和标准错误都重定向到list中)
cat > catfile < ~/.bashrc
命令执行的判断依据:
cmd;cmd 连续命令执行
cmd1&&cmd2:若cmd1执行完毕并正确执行,则开始执行cmd2
若cmd1执行完毕并为错误,则cmd2不执行
cmd1 || cmd2 :若cmd1执行完并正确,则cmd2不执行
若cmd1执行完并错误,则执行cmd2
cmd1 || cmd2 && cmd3:如果cmd1正确则cmd2不执行,此时$?=0继续后传,故&&遇上后,执行cmd3
7. shell script
shell script:利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与命令写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想的处理目的。
在子进程中执行:
直接命令行执行(脚本必须可读可执行chmod a+x)./shell.sh
以bash进程来执行 bash shell.sh
在父进程中执行:
source shell.sh
第一行:#!/bin/bash
声明这个脚本使用的shell名称
#批注
主要环境变量的声明
主要程序部分
告知执行结果
7.1 编写shell script的良好习惯
版本信息
作者与联系方式
版权声明
History
内部特殊的命令,用绝对路径方式执行
执行时需要的环境变量预先声明和设置
交互式脚本:read
随日期变化:data
7.2 shell script的追踪与调试
sh [-nvx] script.sh
-n: 不要执行script,仅查询语法问题
-v: 在执行script前,先将script的内容输出到屏幕上
7.3 善用判断式
利用test命令
test -e /log.txt && echo “exist” || echo “not exist”
利用判断符合[] (中括号两端需要用空格来分隔)
[ -z “$HOME” ] ; echo $?
7.4 shell script的默认变量
shellname.sh opt1 opt2 opt3
$0 $1 $2 $3
$# :参数个数
#@ :所有参数,
$*: “$1c$2c$3” c分隔,默认空格
7.5 条件判断
用法:
if [ 条件判断式 ];then
action
fi
用法:
if [];then
action
elif [];then
action
else
action
fi
利用case ...esac判断
用法:
case $1 in
“one”)
echo “one”
;;
“”)
echo “You MUST input parameters,ex> {$0 word}”
;;
*)
echo “Usage $0 {word}”
esac
7.6 函数
function fname(){
程序段
}
function也是拥有内置变量的,$0代表函数名称,而后续接的变量以$1,$2..代替
7.7 循环
用法1:
while []
do
action
done
用法2:
until []
do
action
done
用法3:
for var in con1 con2 con3 ...
do
action
done
用法4:
for ((初始值; 限制值; 执行步长))
do
action
done
8.一个例子
#!/bin/bash container_id=$(docker ps | grep k8s | awk ‘{print $1}‘)
container_ip=$(docker exec -it $container_id ip addr show eth0 | grep "global eth0" | awk -F ‘ ‘ ‘{ printf $2 }‘ | awk -F ‘/‘ ‘{ print $1 }‘)
help() { echo "USAGE: debug.sh is a tool that show status" echo " e.g.: $0 ErrStats " echo " e.g.: $0 Stats" echo " e.g.: $0 Switch" exit 1; }
ErrStats() { if [ $# == 0 ]; then method="GET" elif [ $# == 1 ]; then method=$1 else echo "Error command" help exit -1 fi path="/Dp/v1/$FUNCNAME" }
Stats() { if [ $# == 0 ]; then method="GET" elif [ $# == 1 ]; then method=$1 else echo "Error command" help exit -1 fi path="/Dp/v1/$FUNCNAME" }
PrintSwitch() { if [ $# == 0 ]; then method="GET" elif [ $# == 1 ]; then method=$1 else echo "Error command" help exit -1 fi path="/Dp/v1/$FUNCNAME" }
curl_command() { Method=$1 Path=$2 echo "Method = "$Method echo "Path = "$Path #cmd="curl -X $Method http://$container_ip:6320$Path | python -m json.tool" cmd="curl -X $Method http://$container_ip:6320$Path" echo "$cmd" /bin/bash -c "$cmd" }
if [ $# == 0 ]; then help elif [ $# == 1 ]; then "$1" elif [ $# == 2 ]; then "$1" "$2" else echo "Error command" help exit -1 fi
curl_command "$method" "$path" |