您的位置:首页 > 运维架构 > Shell

老大让我学Linux之shell变量替换,cat指令,head和tail指令

2011-07-22 10:31 375 查看
Shell变量替换

条件变量替换:

Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换条件放在{}中.

(0) ${parameter}

和$parameter相同,表示变量parameter的值

(1) ${value:-word}

变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.

有点类似 a?a:b

(2) ${value:=word}

与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将word赋值给value

(3) ${value:?message}

若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若此替换出现在Shell程序中,那么该程序将终止运行)

(4) ${value:+word} / ${value+world}

变量以赋值的话,其值才用word替换,否则不进行任何替换

if(value!=NULL)

value=word

(5) ${value:offset}

${value:offset:length}

变量中提取子串,这里offset和length可以是算术表达式.

(6) ${#value}

变量的字符个数 (变量的字符个数,并不是变量个数)

(7) ${value#pattern}

${value##pattern}

去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配#与##的区别在于一个是最短匹配模式,一个是最长匹配模式.


$ cd /usr/local/share

$ echo “$PWD”

/usr/local/share

$ echo “${PWD#*/}”

usr/local/share //匹配完成,注意最前的/被消除了

$ echo “${PWD##*/}”

share //##是最长匹配


(8) ${value%pattern}

${value%%pattern}

于(7)类似,只是是从value的尾部于pattern相匹配,%与%%的区别与#与##一样

(9) ${value/pattern/string}

${value//pattern/string}

进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区

别与上同


注意:上述条件变量替换中,除(2)外,其余均不影响变量本身的值



利用命令替换
在Linux命令行模式下,当遇到一对“`” (上分割符)时,将首先执行“`”中间包含的命令,然后将其输出结果作为参数代入命令行中,这就是命令替换了。它类似于输入输出的重定向功能,但区别在于 命令替换是将一个命令的输出作为另外一个命令的参数。下面来看它的实际应用。
1.使用命令替换
# touch `date +%Y%m%d%k%M%S`.txt
该命令使用了一次命令替换,date +%Y%m%d%k%M%S命令将首先执行,它将按指定格式输出当前的时间。然后,这个时间将被作为touch命令的参数,其结果是建立了一个以当前时间为文件名的文件。
2.使用命令替换
# kill `/sbin/pidof smbd`
该命令将杀掉sshd的所有进程。这里用pidof这个命令给出进程号,因为kill是针对进程号进行操作的。两者通过命令替换,实现了只用一条命令就杀掉sshd所有进程的功能。

----------------------------------------------------------------------------------------------------------------------------------------------------

Cat

Red Hat Linux 有一个工具程序,它能够帮助你保留简短列表,将这些列表收集起来,甚至向你透漏一点你的系统信息。 这个工具叫做 cat,它是 concatenate(连锁) 的简写,意思是合并文件。
cat 命令还会在屏幕上显示整个文件的内容(譬如,键入 cat filename.txt)。如果文件较长,它会在屏幕上飞快地滚过。要防止这一效果的发生,使用 cat filename.txt | less 命令。一起使用管道(|)和 less 命令会一页一页地显示文件。然后,你便可以使用向上或向下的箭头键在页码中向前或向后移动。

使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName
说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting
例子:
cat -n textfile1 > textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3 里。
cat /dev/null > /etc/test.txt 此为清空/etc/test.txt档案内容
cat 也可以用来制作 image file。例如要制作软碟的 image file,将软碟放好后打
cat /dev/fd0 > OUTFILE
相反的,如果想把 image file 写到软碟,请打
cat IMG_FILE > /dev/fd0
注:
1. OUTFILE 指输出的 image 档名。
2. IMG_FILE 指 image file。
3. 若从 image file 写回 device 时,device 容量需与相当。
4. 通常用在制作开机磁片。

cat主要有三大功能:
1.一次显示整个文件。$ cat filename
2.从键盘创建一个文件。$ cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件。 $cat file1 file2 > file

----------------------------------------------------------------------------------------------------------------------------------------------------

head 及tail 命令介绍

head
格式: head [option] .. [FILE]..

当需要查看一个文本文件的头部或尾部时,head 命令及tail 命令可以非常方便的完成该操作。head 命令用于查看一个文本文件的开头部分;而tail 命令则用于显示文本文件的末尾几行。

(1)-c, --bytes=[-]N

打印每个文件的前N个字节,如果N前面加上-,那么就打印每个文件的除了最后N个字节外的所有字节

(2)-n, --lines=[-]N

打印前N行,如果N前加上[-]则打印除了最后N行数据外的所有行

(3)-q, --quiet, --silent

(4)-v, –verbose

举例:
head example.txt 显示文件 example.txt 的前十行内容;
head -n 20 example.txt 显示文件 example.txt 的前二十行内容;

tail

和head相反,输出文件的后部数据。

(1)-c , --byte=K

输出最后k bytes的内容,如果使用 –c +K则输出从第K byte后的所有内容。

(2)-f, --follow[={name|descriptor}]

当文件增长时,输出新增的内容

(2)-n, --lines=K

输出后K行,如果使用-n +K则会输出从第K行开始的所有行

(3)--max-unchanged-stats=N

重新打开一个在N次迭代后没有改变大小的文件,查看它是否已经unlinked或者重命名了。

(4)--pid=PID

和-f搭配使用,在进程PID终止后退出

(5)--retry

断打开一个文件,即使它当前不可以访问,和—follow=name 一起使用

例子:

tail example.txt 显示文件 example.txt 的后十行内容;
tail -n 20 example.txt 显示文件 example.txt 的后二十行内容;
tail -f example.txt 显示文件 example.txt 的后十行内容并在文件内容增加后,自动显示新增的文件内容。
注意:
最后一条命令非常有用,尤其在监控日志文件时,可以在屏幕上一直显示新增的日志信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: