bashbash 的初始化过程的初始化过程1.bash 检查文件 /etc/profile 是否存在 . 如果存在 ,
bash 则读取该文件 , 初始化环境变量 ; 否则跳过 .2.bash 检查用户主目录下的文件 .bash_profile 是否
存在 . 如果存在 ,bash 则读取该文件 ; 否则跳过 .3.bash 检查用户主目录下的文件 .bash_login 是否
存在 . 如果存在 ,bash 则读取该文件 ; 否则跳过 .2.bash 检查用户主目录下的文件 . profile 是否存在 .
如果存在 ,bash 则读取该文件 ; 否则跳过 .
这些步骤都结束完后 , 就显示默认的提示符 $.
输入输入 // 输出重定向输出重定向 : : UNIX 下流的概念 Unix/Linux 系统中,文件的组织方式是按字节进
行的,文件之间和设备之间的信息传递是按字节流进行的,所以信息流的概念在系统管理中很重要。正因为文件被看成字符流, Unix 类系统对文件后缀名没有强制要求,后缀名可以是任意的。
在系统内部,对用户文件的操作被转换为对文件描述符 (fd) 的操作,在执行输入输出命令时, Linux 系统把输入 / 输出文件与信息流的概念对应起来。
注:用一个整数来代表所打开的文件,这个整数就是文件描述符。
输入输入 // 输出重定向输出重定向 : : UNIX 下流的概念 Linux 自动为每条执行的命令 ( 进程 ) 打开三个文件,
分别用于读取输入数据、发送输出数据和错误信息,这三个文件分别叫标准输入 (stdin) 、标准输出(stdout) 和标准错误文件 (stderr)
信息流的标准定义: 标准输入流 (stdin): 文件描述符 0, 默认为键盘 .标准输出流 (stdout): 文件描述符 1, 默认为显示
器 .标准错误流 (stderr): 文件描述符 2, 默认为显示
器 .
输入输入 // 输出重定向输出重定向输入输出重定向就是对系统信息流标准定义的修改输入重定向 < 例 : prog < infile
输出重定向 > ,>> 例 : pwd > outfile ls –l >> file1
例: $ prog < infile > outfile错误流重定向 >& 例 : gcc hello.c >& log
管道线管道线 (pipeline)(pipeline) 的概念的概念 在命令中利用管道线 (|) 将命令隔开 , 实现将一个程序
或命令的输出作为另一个程序或命令的输入 .
例 : $ ls -l | wc -l $ ls –l /dev | grep fd $ cat file | grep hello | wc -l
下列字符可作命令表的分隔符 ; 或 Enter && :若前一命令执行成功,则执行后一命令 || :若前一命令执行失败,则执行后一命令
如果不用管道线,该如何实现这一功能?如果不用管道线,该如何实现这一功能?
例 : write zhang < letter || mail zhang < letter
例 : mail zhang < letter && rm letter
三通道命令 tee 实现一个数据流向多个输出分流 ps –ef | tee progm.ps
环境变量是系统预定义的一些变量,如 PATH,LOGNAME
等变量,例如: echo $PATH
查阅命令 env
相关文件 :
/etc/profile,
~/.bash_profile ,
~/.bash_login
~/.profile
< >
环境变量的设置
shell程序 : 一种解释执行的脚本 (script)语言 ,类似于DOS 下的 .bat文件 ,但功能更强 .
shell是按行解释执行的 ,注释在行首加#,习惯文件的第一行以” #!/bin/sh”开头 ,指明使用哪种解释器 .
执行方式 (三种 ):
1. $ sh < file.sh
2. $ sh file.sh
3. 首先修改 shell程序的权限为用户可执行 , 如 :
$ chmod 755 file.sh
然后在命令行下直接输入 :
$./file.sh (未打通路径,若打通路径, ./ 不需要 )
Shell Programming
shell的变量通常只有字符类型,在 shell编程中也会出现一些数值计算的量,但它们也是基于字符类型完成的。
变量的赋值 . 例 :UNIX=SystemV
或 UNIX=“SystemV OS”
变量的引用 : 在变量名前加 $,如 $UNIX 或 ${UNIX}
${UNIX}tm
打通路径:$ PATH=$PATH:$HOME //$HOME代表需要添加到路径变量中的目录名
shell变量的使用
不同的引号对 shell变量产生不同的效果 .
1)单引号’ ’: shell将单引号中的内容看成纯粹的字符串,如:
$ file=report
$ echo ’ The time is `date`,the file is $file ’
结果: The time is `date`,the file is $file
2)双引号” ”: shell对双引号中的特殊字符进行解释,如: $ echo “ The time is `date`,the file is $file ”
3)反引号 ` `:对反引号中的内容作为 shell命令执行,如: $ TT=`date`
$ echo $TT
shell变量的使用
变量的作用域 shell变量也有局部定义和全局定义之分。不做特殊说明的变量均是局部变量,只在为它赋值的 shell进程中起作用。要是变量在多个进程中都能起作用,通过 export命令使其变为全局变量 .
见书本 71页例子
shell变量的使用
命令的位置变量 在 shell中命令的位置变量类似于 C 语言中 argc 和
argv参数的功能,它们主要对命令行中各个参数的位置进行描述。记住 $#, $?, $$, $!的定义
$# 位置参数的个数 $? 为前一命令返回的状态值( 0 为正常) $$ 当前 shell进程的 pid值 $! 最近访问的后台进程的 pid值 $* 用单字符串显示传递参数
shell变量的使用
例 echoarg.sh内容如下:echo $#
for VAR in $*
do
echo $VAR
done
运行: $echoarg.sh first second third
$0 $1 $2 $3
结果: 3
first
second
third
shell变量的使用
变量的替换 例: $echo “the CDPATH is $ CDPATH”
当 $CDPATH未被赋值时,显示 the CDPATH is
容易让用户产生困惑 .可使用:1. ${var:-word}
2. ${var:=word}
3. ${var:+word}
可将上例改为:$ echo “the CDPATH is $ {CDPATH:-Undefined}”
则显示: the CDPATH is Undefined
shell变量的使用
格式 : test expre 或 [expre]
当表达式的值为真时 ,test命令返回真值 0,否则返回假值非 0.
对文件特性的测试 : test –[dfrwxs] file
对字符串内容的测试 :
建议访问变量使用” $var”的形式对整数的测试例: x1=“005”, x2=5, 注意:$test “$x1” = “$x2” 和$test “$x1” -eq “$x2” 的区别
test命令的使用
格式: if [condition_1]
then
commands_1
elif [condition_2]
then
commands_2
elif [condition_3]
then
commands_3
…….
else
commands_n
fi
多分支条件语句
例 5.7:#!/bin/sh
if [$# -lt 3]
then
echo “usage: `basename $0` arg1 arg2 arg3” >& 2
exit 1
fi
echo “arg1:$1”
echo “arg2:$2”
echo “arg3:$3”
分支条件语句
例 5.8 : testdir
#!/bin/sh
DIREC=$1
if [-z `ls –a $DIREC`]
then
echo “$DIREC is indeed empty”
else
echo “$DIREC is not empty”
fi
运行时可输入:$ testdir /home/user1
例 5.9自己看
分支条件语句
case语句 : case in 结构case word in
pattern-1) pat1-list1;;
pattern-2) pat2-list2;;
……
*) default-list;;
esac
< >
条件控制语句
例 5.11:
#!/bin/sh
hour=`date+%H`
case $hour in
0[1-9] | 1[01]) echo “Good
morning!”;;
1[234567]) echo “Good afternoon!”;;
*) echo “Good evening!”;;
esac
例 5.12:
条件控制语句
例 5.13:# ! /bin/sh
cd $HOME
for dir in cc work
do echo “….in $dir”
cd $dir
for file in *.[c]
do ls –l $file
done
cd ..
done
循环语句
while循环 : while - do - done 结构只要循环条件为真就继续循环下去。while [condition]
do commands
……
last-command
done
例 5.14
< >
循环语句
until循环 : until - do - done 结构只要循环条件为假 ( 非 0 值 ) 就继续循环下去。until [condition]
do commands
……
last-command
done
另外,和 C 语言一样, break 和 continue 语句也可以使用。
< >
循环语句
例 5.15 uon
until who | grep “$1” > /dev/null
do
sleep 30
done
echo “07\07 $1 is logged on.”
exit 0
运行:$ uon lili&
循环语句
expr是对 shell变量进行算术运算的操作 .例:$ count=0
$ count=$count+1
$ echo $count
显示为 0+1
$ count=`expr $count+1`
$ echo $count
显示为 1
expr命令
• 在程序中显示错误信息 echo “usage: ``basename $0` arg1 arg2” >&2
• 将不必要的信息送入系统垃圾文件 /dev/null (黑洞 ) 中例 5.17
#!/bin/sh
if cp myfile myfile.bak > /dev/null 2>& 1
then
echo “good copy”
else
echo “ `basename $0`:error could not copy the
files” >& 2
fi
shell 编程中常用的其他语句
• 在程序运行中读取标准输入流信息 read [word1] [word2]…[rest]
注意 :read语句每次接受输入以换行 ( 回车 ) 结束 ,将输入按照 IFS(默认为空格 ,Tab,回车 ) 定义的分隔符分成不同的域。见例 5.18
shell 编程中常用的其他语句
例 5.18 read_test
#!/bin/sh
echo ”give me a long sentence:”
read word1 word2 rest
echo –e “$word1\n $word2\n $rest”
echo ”end of my act.”
运行后输入: let’s test the read command.
输出:let’s
test
the read command.
end of my act
shell 编程中常用的其他语句
假设 score.txt 文件中保存两个班级的同学的数学成绩,请编写一个 shell 程序计算每个班级的学生人数和平均分。 score.txt 内容如下:
wangpin:class1:87 wubo:class2:96 zhanghua:class1:65 xiaonong:class2:88 jiangbo:class2:93 ……
shell 程序举例
while read NAME CLASS SCOREdo case $CLASS in class1) NUMBER1=`expr $NUMBER1 + 1 ` SCORE1=`expr $SCORE1 + $SCORE ` ;; class2) NUMBER2=`expr $NUMBER2 + 1 ` SCORE2=`expr $SCORE2 + $SCORE ` ;; *) ;; esacdone < $INFILE
shell 程序举例