1 shell注意事项
1)指令的执行时从上到下,从左到右的分析和执行;
2)读到一个Enter符号,就尝试开始执行该行命令;
3)#作为批注;
2 用户变量
2.1定义变量
以字母和下划线开头;(我自己定义变量统一用 下划线+小写字母 例如:(_filename)
_myname=wzt #注意:等号两边不能有空格
引用方法 “$_myname”或$(_myname)
2.2 双引号“ ”,单引号‘ ’和反单引号` ` 的区别
双引号“ ”
将一串字符当成一个字符串来对待,如果字符串中包含特殊含义的字符如$,则转义。
例如: _temp=”the name is $_myname” 则有 echo ${_temp}为the name is wzt
单引号‘ ’
将一串字符当成一个字符串来对待,如果字符串中包含特殊含义的字符,不转义,仅为一般字符
例如: _temp=’the name is $_myname’ 则有 echo ${_temp}为the name is$_myname
反单引号` `
在一串指令中,还需要藉由其他的指令提供信息,可使用`指令`;效果等同于$(指令)
2.3 变量的测试与内容替换
_newname=$( _oldName:-wzt)
假如_oldName没有定义或定义为空字符, _newname=wzt; 否则_newname=${_oldName}
variable:=value #variable为非空字符串时; variable不变, 否则variable=value
variable+=value #variable为非空字符串时; 重新设定其值 variable=value
variable?=value #variable为没有定义; 则variable=value 否则什么都不做
3 环境变量
3.1 HOME
当前用户目录
3.2 PATH
当前用户的可执行文件搜索路径;当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在 当前目录 下面寻找此程序外,还应到由 PATH 变量定义的目录中 去查找增加目录: /home/dmtsai/bin
PATH=${PATH}:/home/dmtsai/bin
还可以修改 /etc/environment 中修改PATH的值 #Ubuntu10.04
还可以修改/etc/profile中 修改PATH的值 #Fedora10
3.3 LANG
程序应该使用的默认语言
3.4 PS1
行提示符4 与变量相关的指令
4.1 export
4.2 unset
取消变量 _myname
unset _myname
4.3 read
从标准输入读取数据
read [-pt] 变量名
-p 后接提示符
-t 等待输入变量的时间(单位 秒)
例如: read -p “please input your name:” -t 30 _username
4.4 declare
宣告变量类型;
declare [-aixr] variable
-a 将后面名为variable的变量定义为成为数组(array)类型
-i 将后面名为variable的变量定义为整数数字(integer)类型
-x 和export 用法一样
-r 将后面名为variable的变量设为只读类型
例如: declare -i _sum=100+300+50
还有另一种方法定义整形数字类型变量
_sum=$((100+300+50))
4.5 echo
echo [-en] “hello word! \n”
-e 引号内有 \n 将执行,否则直接打印
-n 不断行继续在同一行执行
4.6 test
test -e filename
测试指令
-e 该 档名 是否存在
-f 该 档名 是否存在且为档案(file)
-d 该 档名 是否存在且为目录(directory)
4.7 scripts的追踪与debug
sh [-nvx] scripts.sh-n 不要执行 scripts,仅查询语法的问题
-v 再执行 scripts前,先将scripts的内容输出到屏幕上
-x 将使用到的 scripts内容显示到屏幕上,这很有用
4.8 [ ]
判断符号;注意空格,若_位置为空格,则
[_${HOME}_==_${MAIL}_] 判断两个变量是否相同
5 script例程
#!/bin/bash
#program
# This program shows "Hello World!" in my screen.
#History:
#2015/06/01 wzt
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World!\n"
exit 0
第一行必须是#!/bin/bash ,#!是一个特殊的表示符,用来宣告这个script使用的shell名称
批注
主要环境变量的宣告
主要程序部分
执行成果告知(定义传回值)
\a 发出警告声
\n 换行且光标移至行首
5.1 shell scripts 默认参数($0,$1...)
./sh01.sh opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
$# 代表后接的参数个数 以上表为例这里显示为4
$@ 代表 ”$1” ”$2” ”$3” ”$4” 之意,每个变量都是独立的
$* 代表 ”$1”c”$2”c”$3”c”$4” 其中c为分隔符,默认为空格
6 常用函数
6.1 if...then...
if [条件判断式1];then
当条件判断式1成立时,可以进行的指令工作内容
elif [条件判断式2];then
当条件判断式2成立时,可以进行的指令工作内容
else
当条件判断式1,2不成立时,可以进行的指令工作内容
fi
例如
read -p "please input a char: " _fileuser
if [ ${_fileuser} == "Y" ]||[ ${_fileuser} == "y" ];then
echo "ok"
elif [ ${_fileuser} == "N" ]||[ ${_fileuser} == "n" ];then
echo "no "
else
echo "I don't down your input "
fi
exit 0
6.2 case...esac
case $变量名称 in
“第一个变量内容”)
程序段
;; #每个类别结尾使用两个连续的分号来处理
“第二个变量内容”)
程序段
;; #每个类别结尾使用两个连续的分号来处理
*) #最后一个变量内容都会用 * 来代表所有其他值
程序段 #不包含前面所有变量的其他程序执行段
exit1
;;
esac
6.3 function
注意: 使用之前必须先定义
function fnname(){
程序段;
}
带参数, fnname a 2 3
$0 $1 $2 $3
6.4 循环
6.4.1 while...do...done
当condition条件成立时就进行循环,直到condition条件不成立才停止;
while[condition]
do
程序段
done
6.4.2 unstil...do...done
当condition条件不成立时就进行循环,直到condition条件成立才停止;
until[condition]
do
程序段
done6.4.3 for...do...done
固定循环
已经知道要进行几次循环
for var in con1 con2 con3
do
程序段
done
第一次循环时, $var 的内容为 con1
第二次循环时, $var 的内容为 con2
第三次循环时, $var 的内容为 con3
或者
数值处理
for ((初始值;限制值;执行步阶))
do
程序段
done
例如:
for((i=1;i<=$nu;i=i+1))
do
s=$(($s+$i))
done