命令行详解
以一条命令为例:
ls apple
当前文件夹中没有该文件,报错信息如上。
在这里,ls
是一个真实的命令,shell执行该命令, 命令后的都被称为参数。
tail +10 myfile
命令是tail
,+10
myfile
都是参数
在shell脚本程序里,我们经常需要处理参数,有一些内建的方式可以帮助我们访问这些信息:
我们用$+数字
指代命令行中的第几个元素
在上图中,myshell为 $0
,foo为$1
,bar为$2
.
最多可以用$1
到$9
来表示参数
另外用$#
表示参数个数
测试以下一个小程序:
#!/bin/sh
#
# Script that demos, command line args
#
echo "Total number of command line argument are $#"
echo "$0 is script name"
echo "$1 is first argument"
echo "$2 is second argument"
echo "All of them are :- $* or $@"
添加执行权限后chmod 777 demo
有一点需要注意的是:不能给参数赋值
例如 $1=33
这是无效的
IO重定向
很多情况下,我们需要把命令执行的结果输出到文件中保存,有的命令的输入也可以从文件中获得。
有三种主要的重定向符号>
, >>
, <
- Linux-command > filename
将命令执行结果输出到filename命名的文件里,如果文件已经存在并且已经有内容了,则抹掉原来的内容,重写该文件。 Linux-command >> filename
与>
作用基本相同,唯一不同的是如果filename存在,则在文件末端写入输出结果,不覆盖原有内容。Linux-command < filename
从filename文件中读取内容,替代键盘输入。
下面举两个例子说明IO重定向的用法:
cat>sname
vivek
ashish
zebra
babu
Ctrl + D
保存
则上面内容被保存到sname文件中
执行下面语句
sort<sname>sorted_sname
cat sorted_sname
ashish
babu
vivek
zebra
在上面的语句中,sort命令从sname中读取内容,将之排序后又输出到sorted_sname中。
第二个例子
tr "[a-z]" "[A-Z]" <sname >cap_names
cat cap_names
VIVEK
ASHISH
ZEBRA
BABU
tr
命令用来将小写字母转换成大写字母 ,从sname中读出内容,将之全部转换成大写字符后输出到cap_names中。
Pipes
中文里又称为管道,在Linux系统编程中也是一种重要的IPC方式。
shell中pipe是一个连接一个程序的输出,作为另一个程序的输入,并且不需要任何中间文件。
通常用法:
command1 | command2
例子:
使用管道的命令 | 解释 |
---|---|
ls | more | ls命令执行的结果成为more的输入,即将ls执行的结果以more打开 |
who | sort | 将who执行的结果作为sort的输入,所以会输出排序后的用户信息 |
who | sort>user_list | 作用与上句相同,只不过把排序后的结果输出到user_list |
who | wc -l | who执行后把结果作为wc的输入,统计当前用户数 |
ls -l | wc-L | 统计当前目录的文件数 |