shell脚本

shell脚本

工作控制、前景背景控制: (job control, foreground, background)
這部分我們在第十六章 Linux 程序控制中再提及!

在 bash 當中,當一個變數名稱尚未被設定時,預設的內容是『空』的。
参数设置:
	name=zhang
	- 等号两边不能有空格
	  name="is ${HOME}" name='is ${HOME}'
	- 右侧值可以用单引号或双引号,双引号中变量仍然表示变量,单引号则为纯字符串
	- 用反斜杠表示特殊符号(Enter $ 空白 单引号)的转义
	- 用`指令`或者$(指令),来表示其他的指令 version=$(uname -r) 或 version=`uname -r`
	- 使用export 使称为环境变量,从而在子程序中使用
	- unset取消设定, 如unset myname
环境变量
	- env查看所有预定义环境变量
	- set查看环境变量+自定义变量
	- export将自定义变量设置为环境变量,就可以被子程序使用
	- declare将环境变量转变为自定义变量
	- declare 
		确定参数类型,declare -i sum=100+200+500
		变为环境变量,declare -x sum
		变为自定义变量, declare +x sum
特殊字符:
	*: 任意个字符
	?: 1个任意字符
	[]: 括号内的一个字符,如[ads]
	[a-z]: a到z内容一个字符,还有[A-Z] [0-9]
	[^]: 非括号内的一个字符,如[^abc] 表示不为abc中的任意一个
指令连续执行,没有相关性(;): 如 cmd1; cmd2
执行相关联执行(&&): 如 cmd1 && cmd2 , 表示cmd1执行成功则执行cmd2(即cmd1的$?为0)
执行相关联执行(||): 如 cmd1 || cmd2 , 表示cmd1执行失败则执行cmd2(即cmd1的$?不为0)
	如 ls /tmp/abc && touch /tmp/abc/zhang.txt, 表示/tmp/abc存在则创建

shell的执行方式:
	sh demo.sh 或者 ./demo.sh, 会用子shell执行脚本,结束后其中的参数不会在父shell中看到
	source demo.sh,是当前shell执行脚本
test 查看文件是否存在等
	-e 文件是否存在
	-f 文件是否存在且为file
	-d 文件是否存在且为目录
	
	-r 是否存在且可读
	-w 是否存在且可写
	-x 是否存在且可执行
	
	-nt (newer than) file1是否比file2新
	-ot (older than) file1是否比file2旧
	-ef 是否为同一档案,可用作判断hard link上,主要意义在判定是否均指向同一个inode
	
	-eq 两数是否相等
	-ne 是否不相等
	-gt n1大于n2
	-lt n1小于n2
	-ge n1大于等于n2
	-le n1小于等于n2
	
	test -z string 字符串是否为空,为空则为true
	test -n string 字符串是否为非空,为空则为false,-n可省略
	test str1 == str2 字符串是否相等
	test str1 != str2 是否不相等
	
	-a 两状况同时成立, 如 test -r file -a -x file, 则同时具有r和w权限才返回true
	-o 两状况任何一个成立
	!  相反状态, 如test ! -x file, 当file不具备x时返回true
	
	
	-z 参数是否为空或未定义
[]作为判断符
	- 中括号内每个部分都要空格分隔
	- 变量用双引号括起来
	- 常量用单引号括起来
	
中括号的使用方法和test几乎一模一样,只是比较常用于if...then...fi中。
预设参数
	$0 程序名称
	$1 $2 $3 参数1、2、3
	$# 参数个数
	$@ 代表『 "$1" "$2" "$3" "$4" 』之意,每個變數是獨立的(用雙引號括起來);
	$* 代表『 "$1c$2c$3c$4" 』,其中 c 為分隔字元,預設為空白鍵, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
	
	 $@ 與 "$@" 的結果並不一樣喔!當你輸入的參數內帶有雙引號 (") 時,建議還是得要使用 "$@" 來帶入腳本中, 否則雙引號會被取消,這樣執行結果的差異會相當大喔!尤其是像『 ./script one "a   to   b" 』這種僅有兩個參數,但是參數內還有空白字元的, 最容易出現莫名的問題喔!
条件判断
	if [ 条件判断式 ]; then
		command
	elif [ 条件判断 ]; then
		command
	else
		command
	fi

case语句
	case $1 in
		"hello")
			echo "Hello"
			;;
		"")
			echo "Must input param"
			;;
		*)
			echo "Usage $0 {hello}"
			;;
esac
函数功能
function fname() {
	程序段
}
	如function printit(){
			echo -n "Your choice is "
	}

while循环
while [ condition ]
do
	command
done
或者
until [ conditon ]
do
	command
done

例子

while [ "${yn}" != "yes" -a "${yn}" != "YES" ]
do
        read -p "Please input yes/YES to stop this program: " yn
done

echo "OK!"
for循环
for var in con1 con2 con3 ...
do 
	command
done

#!/bin/bash

network="192.168.1"
for sitenu in $(seq 1 10)
do 
	ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
	if [ "${result}" == 0 ]; then
		echo "Server ${network}.${sitenu} is Up."
	else 
		echo "Server ${network}.${sitenu} is Down."
	fi
done
for(( 初始值; 限制值; 执行步骤))
do
	command
done

#!/bin/bash

read -p "Please input a number: " nu

s=0
for (( i=1; i<=${nu}; i=i+1))
do 
	s=$((${s} + ${i}))
done
echo "The result is ${s}"
shell script 的追蹤與 debug
sh [-nvx] scripts.sh
	-n: 不执行,仅查询语法问题
	-v: 执行前,先将脚本内容打印
	-x: 将使用到的script内容展示到屏幕上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值