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命令就可以重新编译