《LinuxShell脚本攻略》笔记,Chap-1:小试牛刀
简介
#bash(Bourne Again Shell),shell环境使得用户能与操作系统的内核进行交互操作
#!/bin/bash
#date
#description
cmd1; cmd2
cmd3
#sh /path/xx.sh
#Bash还有一个历史记录文件 ~/.bash_history
终端打印
#终端作为交互式工具,用户可以通过它与shell环境进行交互
echo '$var'
echo $var
echo -e "1\t2\t3"
echo -e '\e[1;31m Red color \e[0m' #彩色
echo {1..10} #输出1到10
echo {A..H} #for i in {a..z}
cat << EOF
11
22
33
EOF
# \转义字符
printf "%-5s %-10s $-4.2f\n" 001 Zhang 56.789
#格式替代符%s %d %c %f, -左对齐
玩转变量和环境变量
#Bash中,每一个变量默认值值都是字符串形式
#环境变量和自定义变量
echo $SHELL
echo $UID
var=value #这是赋值
#var = value这是相等操作
echo $var
echo ${var}
echo ${#var} #字符数
#export用来设置环境变量,此后,任何shell中的程序都会继承环境变量
ZHANG=Gentleman
export ZHANG
PATH="$PATH:/home/zhang/bin"
export $PATH
通过shell进行数学运算
#let, expr, bc, [], (())
#要注意默认是字符串类型哦
n1=1;n2=2
let sum=n1+n2
let n1++;let n2-=1
sum=$[ n1 + n2 ]
sum2=$(( sum + 3 ))
sum=`expr 3 + 4`
#浮点计算 bc
echo "8 * 1.1" | bc
#设置小数点精度
echo "scale=2; 3/8" | bc
#进制转换
num=100
echo "obase=2; $num" | bc
num=1100100
echo "obase=10; ibase=2; $num" | bc
#平方和平方根
echo "sqrt(100)" | bc
echo "10^2" | bc
文件描述符重定向
#最常用的文件描述符是 stdin(0), stdout(1), stderr(2); 通过内容过滤将输出重定向到文件
echo "This is a sample text 1" > temp.txt #覆盖
echo "This is sample text 2" >> temp.txt #追加
ls + >stdout.txt 2>stderr.txt
cmd 2>&1 /dev/null == com &> /dev/null #null设备也被称为黑洞
#当一个command发生错误并退回时,它会返回一个非0的状态码
echo $?
#tee命令,一方面可将数据重定向到文件,另一方面还可提供一份重定向数据的副本作为后续命令的stdin
#tee默认覆盖文件,-a选项追加
cat temp.txt | tee tee.txt | cat -n
数组和关联数组
#数组借助索引将多个独立的数据存储为一个集合
#普通数组只能使用整数作为数组索引,而关联数组可以使用字符串作为数组索引
#还可将数组定义成一组索引-值(index-value)
arr=(1 two 3 four 5)
echo ${arr[0]}
arr[0]=One
index=3
echo ${arr[$index] #arr[3]
echo ${arr[*]}
echo ${#arr[*]} #arr-length
#关联数组可用任意文本作为数组索引
declare -A ass_arr
ass_arr=([index1]=val1 [index2]=val2 ...) #内嵌索引-值
ass_arr[index3]=val3 #独立索引-值
echo ${!ass_arr[*]} #列出数组索引
别名
#alias作用是暂时的,关闭终端后别名就失效;
#为使别名一直保持,可将其写入 ~/.bashrc,因为每一个新的shell都会执行~/.bashrc中的命令
#新设置的别名将取代已有别名
alias vi=vim; unalias vi
echo "alias ll='ls -l --color=auto'" >> ~/.bashrc
#\对别名命令进行转义,执行原本的命令。避免攻击者利用别名将某些特权命令替换成别有用心的命令
\vi test.sh
获取、设置日期和延时
#很多应用程序需要以不同的格式打印日期,设置日期和时间,以及根据日期和时间执行操作;
#延时通常用于在程序执行过程中提供一段等待时间;
#在Unix-like系统中,日期被存储为一个整数,其大小为世界标准时间1970年1月1日0时0分0秒起所流逝的秒数;
#这种计时方式被称之为 纪元时或Unix时间;
#通过纪元时间,可知道两个日期之间相隔了多少秒
#编写以循环方式运行的监视脚本时,设置时间间隔是必不可少的
date +%s
#!/bin/bash
start=$(date +%s)
commands
sleep 1
end=$(date +%s)
diff=$((end - start))
echo "$diff seconds"
调试脚本
#调试功能能在出现一些异常情况时生成运行信息
#!/bin/bash -xv
sh -x
sh -n
函数和参数
function fname()
{
statements
}
fname()
{
echo $1, $2 #访问第参数1和参数2,$n第n个参数
echo "$@" #以列表的形式一次性打印所有参数
echo "$*" #类似于$@,但参数被作为单个实体
return 0 #f返回值
}
fname 1 22 333 #返回上面定义的变量
#递归函数,能够调用自身,不断地生成新的进程,最终会造成xx
#导出函数,使用export导出,这样函数作用域就可以扩展到子进程
export -f fname
#读取命令返回值
echo $?
读取命令序列输出
#输入通常是stdin,输出stderr或stdout,这些命令称为 过滤器(filter)。我们使用 管道(pipe) 来连接每一个过滤器
cmd1 | cmd2 | cmd3
#子shell,子shell生成独立的进程,不会对当前shell有任何影响,所做改变仅限于子shell内
zhang=$(ls | cat -n)
#反引用
zhang=`ls | cat -n`
读取字符
#read是一个重要的从标准输入中读取文本的命令
#可以使用read以交互的形式来读取用户的输入
read -n 5 zhang #读取字符数
echo $zhang
read -s passwd #不回显
echo $passwd
read -t 5 zhang #超时时间
echo $zhang
read -p zhang #显示提示信息
echo $zhang
read -d ":" zhang #定界符结束输入
123:
echo $zhang
字段分隔符和迭代器
#内部字段分隔符(Internal Field Separator, IFS)是shell中的一个重要概念
#IFS的默认值为空白字符(换行符、制表符、空格)
awk -F: '{print $1,$3}' /etc/passwd #IFS=":"
#对一些列值进行迭代,循环非常有用
for i in {1..10}
do
cmd
done
while condition
do
cmd
done
until condition
do
cmd
done
比较与测试
#程序中的流程控制是由比较和测试语句来处理的
if condition1 || condition2
then
cmd1
elif condition3 && condition4
then
cmd2
else
cmd3
fi
#算术比较
if [ $num -ge 10 -a $num -lt 20 ]
-eq
-gt
-ge
-lt
-le
-a
-o
#文件系统相关
if [ -f $file1 -o -x $file2]
-x
-w
-r
-f
-d
-e
-b #block
-l
#字符串比较
[[ $str1 = $str2]]
= #=号旁有空格--是比较关系;=号旁没空格,是赋值语句
!=
>
<
-z #空字符
-n #非空字符
#使用test命令来执行条件检测
if [ $num -eq 0 ] -- if test $num -eq 0
网友评论