[读书笔记]鸟哥的LINUX私房菜 十三章 shell scripts

shell scripts语法

#!/bin/bash   规定使用bash语法解释scripts
#Program:    表明程序开始
主程序部分
exit 0            表明程序结束 #用sh执行脚本会新开一个子进程bash来执行,脚本中产生的变量不存在与父进程
#用source 执行脚本会直接在本进程中执行脚本,变量会保留。  注意如果用SOURCE执行就不要加exit 0了,因为它会关闭父进程。
 
sh 脚本文件 参数一 参数二 。。。 $0文件名 $1参数一 $#参数个数 $@显示所有参数
date1=$(date -d '-1 day' +'%Y%m%d%A') date指令-d '-1 day'表示一天前,也可以用week year month等。 +'%Y%m%d%A'是把日期传给变量
total=$(($num1*$num2))    $((表达式))   用$加双括号可以计算表达式, 只支持整数。
printf {"%d * %d = %d",$num1,$num2,$total}  用printf格式化输出记得加 {}大括号
 
test指令 测试文档,目录,比较两个数值,两个文件等,权限等,用法巨多,参考P453
test -e sh04.sh && echo "yes" || echo "no"  如果文件存在则输出YES   -e测试文件或目录是否存在
 
read -p "filename:" filename #检查文件的rwx读写执行权限
test -r $filename && authority='r' || authority='_'  记得要用$把变量取出后才能使用
test -w $filename && authority=$authority'w' || authority=$authority'_'   注意是给authority重新复制,不可au=au+xx这样!!
test -x $filename && authority=$authority'x' || authority=$authority'_'
echo "$authority"
 
[ $a == $b ] && echo "equel" || echo "not"   可用中括号来进行变量的判断 注意中括号两侧,判断号两侧必须留空格!!!
如果变量时字符串的时候要用双引号引起 如[ "$a" == "$b" ]  否则 如a="nihao",$a=nihao, "$a"="nihao",如果没双引号的nihao就变成变量了
 

PS:shell中单引号中不会把变量的值调出,直接使用字面意思。  而双引号就会引用出隐含意,比如\n就会生效 

sed "s/'/\"/g" sh05.sh   就可以将单引号换成单引号,而sed 's/\'/"/g' sh05.sh 就不可以,因为此时反斜杠转义符无生效!!
 
[ "$yn" == "n" -o "$yn" == "N" ] && echo "no" && exit 0      1,-o代表或 2,连续使用&&可延续判断,如先输出no再exit
[ "$#" -lt "2" ] && echo "avgs too little" && exit 0 中括号比较不能用>这种符号 要用 gt,lt,eq,ne,ge,le
if else 多重判断语法
read -p "please input (Y/N):" yn
if [ "$yn" == "y" ] || [ "$yn" == "Y" ]; then     #记得中括号之间的内容一定要有空格!!!!     IF后一定要有分号;!!!
         echo "yes"
         exit 0
elif [ "$yn" == "n" ] || [ "$yn" == "N" ]; then  # if  elif  与中括号之间,一定要有空格!!!
         echo "no"
         exit 0
else
echo "i don't know what you'v type in"
fi
testing=$(netstat | grep ":http")  将输出导入变量的语法!!
date --date "20101018" +%s  把日期字符串转化为秒!  注意字符串要引号括起, +%s前必须空格!! shell考虑空格的!!
case语法
case $1 in   #case 变量 in
"hello")        #字符串加右括号
        echo "you type hello"
        ;;        #双分号代表此段结束
"")
        echo "you type nothing"
        ;;
*)              #星号代表default
        echo "else"
        ;;
esac         #反写case代表case语法段结束
function建立函数语法
function printIt()  #function关键字 空格 函数名 括号
{                         #用双大括号包围函数体
        echo "I just use function"
}
 
printIt                 #调用函数时,只需写函数名,不用括号!!!
printIt
exit 0
 
函数名 参数一 参数二 。。。 $0文件名 $1参数一 $#参数个数 $@显示所有参数
 
循环loop
read -p "please input a word,type yes to end:" word
while [ "$word" != "yes" ] && [ "$word" != "YES" ]    #条件可以用|| &&相连    do开始 done结束
do
        read -p "please input a word,type yes to end:" word
done
read -p "please input a word,type yes to end:" word
until [ "$word" == "yes" ] || [ "$word" == "YES" ]
do
        read -p "please input a word,type yes to end:" word
done
 

forxunhuan

for animal in dog cat bird elephanp     #语法跟python差不多, 后面的循环列表用空格隔离
do
        echo "this is ${animal}s"              #这里要注意 如果想在变量后直接加字符  就用{}大括号括住再取出变量
done
exit 0
 
users=$(cut -d ':' -f1 /etc/passwd)  通过指令把多个值(多行)存到变量中  再用for循环多个值
for username in $users
do
        id $username
        finger $username
done
seq 相当于python的range()
sum=0
for i in $(seq 1 100)  #从1到100的序列    seq 1 2 10表示1到10步长为2   seq 10 -1 1 表示10到1 步长为-1
do
        sum=$(($sum+i)) #  钱双括号来计算
done
echo "$sum"
 
for循环的第二种形式
read -p "input a number:" num
sum=0
for((i=0;i<=num;++i))   #支持i=i+1 i++ ++i这样的操作 
do
        sum=$((sum+i))
done
echo "$sum"
 
scripts 调试
sh -x 很有用 把运行的语句打印出来 变量也显示为当时的值     -n 仅显示错误提示,不运行
gcc makefile
gcc -c file.c 产生.o文件           gcc -o filename file1.o file2.o  产生filename.exe文件
 
main:hello.o hello2.o   前面的main是文件名而已,与exe文件名对应即可,然后列举需要用到的。o文件
        gcc -o main hello.o hello2.o   这里前面空格用TAB

当更新了.c文件后,直接再下一次make命令就可以重新编译

原文地址:https://www.cnblogs.com/iyjhabc/p/2987483.html