shell 执行方式的区别:
1 ,直接执行 sh *.sh ./*.sh 是开一个子进程来执行脚本,进程完成后,子进程的各项变量和操作会结束,不会传回到父进程中。
2,sourece *.sh 是在父(当前)进程中执行,脚本内设置的变量,也会继续有效。
利用 test 和 判断符号 [] 做判断
例: test -e /fileOrdir && echo "exist" || echo "Not exist" 查看当前文件名是否存在 存在打印 exist 不存在 打印 Not exist
[ -z "$HOME" ]; echo "$?" 注:中括号两边必须有空格来分隔
下面是一些 常用字符 所代表的意思, 不至test 、 [] 、shell 的循环和if 中也会用到
shell script 的默认变量($0 , $1 ...)
$0 代表脚本名字 $1 代表脚本后面的第一个参数 $2 代表脚本后面的第二个参数
$# : 代表参数个数 包括脚本名字 $0
$@ : 代表全部变量
$* :大体同上
输入: sh sh07.sh one two
例: echo "The script name is ===> $0" # 输出 sh07.sh
echo "total param number is ===> $#" #输出 3
[ "$#" -lt 2 ] && echo "number of parameter is less than 2 stop here " && exit #判断参数小于 2个 退出
echo "your whole param is ===> '$@' " # 打印全部参数 one two three
echo "the 1st param is ====> $1 " ##打印打一个参数 one
echo "the 2ed param is ====> $2 " ##打印第二个参数 two
shift 可以造成参数偏移
sh sh08.sh one two three four five six
echo "total param is ====> $#" # 7
echo "your whole param is ====> '$@' " # one two three four five six
shift # 进行一次偏移 后面可以带数字 shift 2 代表偏移两次
echo "total param is ====> $#" 6 偏移两次 5
echo "your whole param is ====> '$@' " # two three four five six 偏移两次 three four five six
条件判断式:
if ..... then
....
elif .... then
...
fi # if 的结束是 if 反过来
例:
[ "$yn" == "Y" ] || [ "$yn" == "y" ]; 等同 [ "$yn" == "Y" -o "$yn" == "y" ] (少个中扩号)
if [ "$yn" == "Y" ] || [ "$yn" == "y" ];then # -o 等于 || (or) -a 等于&& (and) ! 非
echo "ok "
exit 0 #程序结束 返回 0 相当于return 如果用在函数的返回中需要用return exit 将会退出程序 而不是退出函数
elif [ "$yn" == "N" -o "$yn" == "n" ]; then
echo "No"
exit 1
fi
case esac (同语言的switch case语法)
case $变量名称 in
"第一个选择项内容")
程序段
;; 两个;; 相当于 break
"第二个选择项内容")
程序段
;; 两个;; 相当于 break
*)相当于 define 其他的所有选项
程序段
;;
esac
输入: ./xxx.sh one
例:
case $1 in
"hehe")
echo "you input hehe"
;;
"one")
echo "you input one"
;;
*)
echo "you input other $1"
;;
esca
shell script 函数:
function fucName() {
程序段
}
例子函数参数:同一个脚本
function func()
{
if [ "$1" == "haha" ]; then
echo "$0" #这里将打印 func
echo "sb bie haha"
elif [ "$1" == "hehe" ]; then
echo "hehe ni mei"
else
echo "exit"
return 0 #如果这里用 exit 将会直接退出程序 再不会到下面的while循环中
fi
}
while true
do #do 必须另起一行
read -p "please input" name
func $name #函数的变量 $0(函数名) $1(函数后面的第一个参数) ... 和 script shell 默认变量 $0(脚本名) $1(脚本后面 输入的第一个参数)... 可以把shell # script 想象成 特殊的函数
if [ "$?" == "0" ]; then #如果运行脚本的返回 值 是 0 则退出程序
exit 0
fi
done
不同脚本之前的函数调用:
sh12.sh
function func()
{
case $1 in
"one")
echo "func one"
;;
"two")
echo "func two"
;;
"three")
echo "func three"
;;
*)
echo "func sx"
;;
esac
if [ "$2" == "haha" ]; then
echo "haha nimei";
elif [ "$2" == "hehe" ]; then
echo "hehe doubi"
elif [ "$2" == "exit" ]; then
return 0
elif [ "$2" == "" ]; then
echo "input sb"
fi
return 1
}
sh13.sh 调用另一个脚本函数 先要载入 source path/*.sh
source ${PWD}/sh12.sh
func $1 $2
if [ "$?" == "0" ]; then
echo "exit sb"
elif [ "$?" == "1" ]; then
echo "other input"
fi
循环:
while [条件] #条件成立则执行循环
do
程序段
done
until [条件] #条件成立则停止循环
do
程序段
done
# ! bin/sh
if [ "$1" == "" ]; then
echo "please input a param"
exit 0
fi
s=0
i=0
until [ "$i" == "$1" ] # 如果 i = 输入的第一个参数 则停止循环
do
i=$(($i+1)) # i=$b 表示把变量b 赋值给变量i 注前面不带 $
s=$(($s+$i)) # ((..)) 两个括号 表示取整数 里面可做运算
done
echo "The result of '1+2+...+$1 = $s'"
for var in con1 con2 ...
do
程序段
done
例:
for animal in dog cat elephant
do
echo "$animal" #第一次执行时 animal == dog 第二次为cat 第三次为 elephant
done
users= $(cut -d ":" -f1 /etc/passwd)
for username in $users
do
echo “$username” #会打印出所有的名字
done
for ( (初始值; 限制值; 执行步长) )
do
程序段
done
例:
s = 0
for ( (i=1; i <= $nu; I=i+1 ) )
do
s = $( ($s + $i) )
done
echo "the relust 0f 1+2+3+...+$nu is $s" #累加计算到输入的值
# !bin/sh
q="q"
w="w"
e="e"
r="r"
t="t"
y="y"
for var in q w e r t y
do
echo "$var "
done
if [ "$1" == "" ]; then
echo "please input param"
exit 0
fi
for ((i=1;i<="$#";i=i+1))
do
echo "the i param = $i"
done
users=$(cut -d ':' -f1 /etc/passwd) #取用户的第一列 用户名
i=0
for username in $users
do
i=$(($i+1))
echo " $i = $username"
done
shell script 的追踪及调试
sh [-nvx] script.sh
-n 不执行script,只查询语法问题 若无语法错误 屏幕不会显示任何信息
-v 执行script前,先将script的内容输出到屏幕上
-x 将script的执行过程全显示到屏幕上,用户可以根据执行此看出执行那一段会出错,并修改自己的脚本。非常好的功能
多看,多模仿网上的相当有用的script,并加以修改成自己的script。是最快的学习手段。
学shell得主要目的是更方面的与操作系统打交道,做一些工具,或批处理,贴段与系统相关的操作
# !bin/sh
if [ ! -e "/zky/sh/hehe" ]; then
echo "11111"
touch hehe
exit 0
else
if [ -f "/zky/sh/hehe" ]; then
echo "22222"
rm /zky/sh/hehe
mkdir /zky/sh/hehe
exit 0
else
echo "33333"
rm -r /zky/sh/hehe
touch /zky/sh/hehe
exit 0
fi
fi