Shell 学习(一)

1. start
who
查看系统登录用户
who | wc -l
计算显示的行数,就是几个用户
cat > nusers
who | wc -l
^D  (Ctrl+D end-of-file)
./nusers
将命令输入文件,执行

2. Shell 第一行  !#
当执行文件时,碰到!#,就会去找后面的路径的解释器,和可能的选项
eg: !# /bin/csh –f
/bin/csh 是csh的解释器,查看了/bin目录下可以发现一些可用的解释器像:

这一行的长度尽量不超过64字符
当然平台和操作系统的不同长度限制也不一样

3. Shell的基本
- 后接选项, -- 也可以起到同样的效果
;(分号)可以用来分隔一行中的多个命令
& 命令后台执行

shell识别的三种命令:
a) 内建命令:由Shell本身执行的命令,有些因为必要性而建,像cd,read(将来自用户或文件的输入数据传给shell变量),有些为了效率而建,test;还有I/O命令,echo,printf
b) Shell函数:一系列以Shell语言写成的程序代码,可以像命令一样使用
c) 外部命令:Shell的副本(新的进程)所执行的命令,建立一个新的进程,在进程中寻找PATH下的命令,/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin为PATH典型默认值,找到命令后取代Shell执行,执行完后回到父Shell读取下一条命令

变量赋值时包含空格的,要用引号包含起来
变量取值用 $
同时连接几个变量也要用双引号

echo命令,显示参数到终端,空格分隔参数,并以换行符结束
很多版本支持-n选项,用来省略最后的换行符
echo –n “first try”
在测试的虚拟机中的linux不支持echo的转义字符的显示

printf,就像c++中的一样,不自动添加换行符,需要手动的\n
可以包含格式声明(%d,%s),
printf “the first program always print ‘%s %s!’” Hello World

重定向:
< 改变标准输入
tr –d ‘\r’ < dos-file.txt
> 改变标准输出
tr –d ‘\r’ < dos-file.txt > output.txt
使用>时,如果output不存在,创建,如果存在则覆盖其中的内容
>> 附加到文件
for f in dos-file*.txt
do
tr –d ‘\r’ < $f >> appendFile.txt
done

| 管道
program1 | program2
| 可以连接多个执行的命令,前一个的输出作为后一个输入
| 执行的效率是使用临时文件的至少10倍
所以|是shell真正多被用到的
tr –d ‘\r’ < dos-file.txt | sort > output.txt

注意:构造管道时,应该遵守一个原则:试着让每个阶段的数据量变得更少。把让数据量变得更少的那一个步骤放在管道的前面,这样Unix可以在两个程序之间移动的数据更少,每个程序要做的更少。比如在sort之前,grep找出相关的行

tr
语法: tr [options] source-char-list replace-char-list
用途: 转换字符
选项:
-c 取source-list的反义,要转换的字符是没有在source-list中的,通常和-d或-s一起使用
-C 与-c相似,但处理的是字符,而不是二进制字节值(为什么?,什么意思?)
-d 自标准输入删除source-char-list中的字符,而不是转换它们
-s 自标准输入中连续重复出现source-char-list里所列的字符,则将其浓缩成一个
行为模式:如同过滤器,自标准输入读取,写到标准输出

特殊文件
1./dev/null
这个文件被称作位桶(bit buchet), 传送到此文件的数据都会被系统丢掉。
当数据写到此文件时,系统认为操作成功,但是其实什么都没做。
如果需要的是命令的退出状态,而不是它的输出,那么/dev/null很有用

2./dev/tty
在程序打开这个文件时,Unix会自动将它重定向到一个终端【一个实体console或serial port,也可能是一个通过网络与窗口登录的伪终端】在与程序结合。这在程序必须读取人工输入时特别有用。
eg:
printf “Enter new password: “
stty -echo //关闭自动打印输入字符功能
read pass < /dev/tty
printf “Enter again: “
read pass2 < /dev/tty
stty echo //打开自动打印输入字符功能
注意: stty(set tty)命令用来控制终端(或窗口)的各种设置。-echo选项用来关闭自动打印每个输入字符的功能。stty echo恢复

Shell脚本的命令行参数
位置参数,也就是Shell脚本中的命令行参数。同样也可以是函数的参数,都由数字来命令,当数字超过9时,用大括号
eg:
echo first arg is $1
echo tenth arg is ${10}
此外,通过特殊变量,还可以取得参数的总数,所有参数的值。
见findUser.sh

简单的执行跟踪
有两种方式:
1. 在命令行执行时, 通过-x 选项来打开跟踪功能
sh –x findUser.sh root
+ who
+ grep root
执行后,会显示每个被执行的命令,并且命令前加一个+号和空格
2. 在脚本中使用
set –x         //打开跟踪
… //一些命令
set  +x //关闭跟踪
注意:set –x 这条命令不会被跟踪,因为功能在执行完它后才打开,set +x则会被跟踪,因为执行完它后,功能才关闭


猜你喜欢

转载自patrick002.iteye.com/blog/833668