高级Bash脚本编程指南(22):基本命令

高级Bash脚本编程指南(22):基本命令

成于坚持,败于止步

新手必须要掌握的初级命令

ls

"列出"文件的基本命令. 但是往往就是因为这个命令太简单, 所以我们总是低估它. 比如, 使用-R选项, 递归选项, ls将会以目录树的形式列出所有文件. 另一个很有用的选项-S, 将会按照文件尺寸列出所有文件, -t, 将会按照修改时间来列出文件, -i选项会显示文件的inode

root@haitao-VirtualBox:~/test# ls -i
288455 test1.sh  288456 test2.sh
root@haitao-VirtualBox:~/test# ls -s
total 8
4 test1.sh  4 test2.sh
root@haitao-VirtualBox:~/test# ls -t
test2.sh  test1.sh
root@haitao-VirtualBox:~/test# 
cat

cat, 是单词concatenate的缩写, 把文件的内容输出到stdout. 当与重定向操作符(>或>>), 一般都是用来将多个文件连接起来.

cat命令的-n选项是为了在目标文件中的所有行前边插入行号. -b也是用来加行号的, 但是不对空行进行编号. -v选项可以使用^标记法来echo出不可打印字符. -s选项可以把多个空行压缩成一个空行.

root@haitao-VirtualBox:~/test# cat test1.sh 
#!/bin/bash
# test.sh		


ls -l &
wait


echo "Done."
root@haitao-VirtualBox:~/test# cat -n test1.sh 
     1	#!/bin/bash
     2	# test.sh		
     3	
     4	
     5	ls -l &
     6	wait
     7	
     8	
     9	echo "Done."
root@haitao-VirtualBox:~/test# cat -b test1.sh 
     1	#!/bin/bash
     2	# test.sh		


     3	ls -l &
     4	wait


     5	echo "Done."
root@haitao-VirtualBox:~/test# cat -s test1.sh 
#!/bin/bash
# test.sh		

ls -l &
wait

echo "Done."
root@haitao-VirtualBox:~/test# 
tac

tac命令, 就是cat命令的反转, 这个命令将会从文件结尾部分列出文件的内容.

root@haitao-VirtualBox:~/test# tac test1.sh 
echo "Done."


wait
ls -l &


# test.sh		
#!/bin/bash
root@haitao-VirtualBox:~/test# 
rev

把每一行中的内容反转, 并且输出到stdout上. 这个命令与tac命令的效果是不同的, 因为它并不反转行序, 而是把每行的内容反转.

root@haitao-VirtualBox:~/test# rev test1.sh 
hsab/nib/!#
		hs.tset #


& l- sl
tiaw


".enoD" ohce
root@haitao-VirtualBox:~/test# 

cp

这是文件拷贝命令. cp file1 file2把文件file1拷贝到file2, 如果file2存在的话, 那么file2将被覆盖

特别有用的选项就是-a选项, 这是归档标志(目的是为了copy一个完整的目录树), -u是更新选项, -r和-R选项是递归标志.

cp -u source_dir/* dest_dir

把源目录"同步"到目标目录上,也就是拷贝所有更新的文件和之前不存在的文件.

mv

这是文件移动命令. 它等价于cp和rm命令的组合. 它可以把多个文件移动到目录中,甚 至将目录重命名. 想察看mv在脚本中使用的例子

当使用非交互脚本时, 可以使用mv的-f(强制)选项来避免用户的输入.当一个目录被移动到一个已存在的目录时, 那么它将成为目标目录的子目录.

rm

删除(清除)一个或多个文件. -f选项将强制删除文件, 即使这个文件是只读的. 并且可以用来避免用户输入(在非交互脚本中使用).

rm将无法删除以破折号开头的文件.

bash$ rm -badname
rm: invalid option -- b
Try `rm --help' for more information.
解决这个问题的一个方法就是在要删除的文件的前边加上./ .

bash$ rm ./-badname

另一种解决的方法是在文件名前边加上" -- ".

bash$ rm -- -badname

当使用递归参数-r时, 这个命令将会删除整个目录树. 如果不慎的使用rm -rf *的话, 那整个目录树就真的完了.

rmdir

删除目录. 但是只有这个目录中没有文件的时候 -- 当然会包含"不可见的"点文件 , 这个命令才会成功.

mkdir

生成目录, 创建一个空目录. 比如, mkdir -p project/programs/December将会创建指定的目录, 即使project目录和programs目录都不存在. -p选项将会自动产生必要的父目录, 这样也就同时创建了多个目录.

chmod

修改一个现存文件的属性

chmod +x filename
# 使得文件"filename"对所有用户都可执行.

chmod u+s filename
# 设置"filename"文件的"suid"位.
# 这样一般用户就可以在执行"filename"的时候, 拥有和文件宿主相同的权限.
# (这并不适用于shell脚本.)

chmod 644 filename
# 对文件"filename"的宿主设置r/w权限,
# 对一般用户设置读权限
# (8进制模式).

chmod 1777 directory-name
# 对这个目录设置r/w和可执行权限, 并开放给所有人.
# 同时设置 "粘贴位".
# 这意味着, 只有目录宿主,
# 文件宿主, 当然,
# 还有root可以删除这个目录中的任何特定的文件.

chattr

修改文件属性. 这个命令与上边的chmod命令项类似, 但是有不同的选项和不同的调用语法, 并且这个命令只能工作在ext2文件系统中.

chattr命令的一个特别有趣的选项是i. chattr +i filename将使得这个文件被标记为永远不变. 这个文件将不能被修改, 连接, 或删除, 即使是root也不行. 这个文件属性只能被root设置和删除. 类似的, a选项将会把文件标记为只能追加数据

root# chattr +i file1.txt

root# rm file1.txt

rm: remove write-protected regular file `file1.txt'? y
rm: cannot remove `file1.txt': Operation not permitted
如果文件设置了s(安全)属性, 那么当这个文件被删除时, 这个文件所在磁盘的块将全部被0填充.

如果文件设置了u(不可删除)属性, 那么当这个文件被删除后, 这个文件的内容还可以被恢复(不可删除).

如果文件设置了c(压缩)属性, 那么当这个文件在进行写操作时, 它将自动被压缩, 并且在读的时候, 自动解压.

使用chattr命令设置过属性的文件将不会显示在文件列表中(ls -l).

ln

创建文件链接, 前提是这个文件是存在的. "链接"就是一个文件的引用, 也就是这个文件的另一个名字. ln命令允许对同一个文件引用多个链接, 并且是避免混淆的一个很好的方法、

ln对于文件来说只不过是创建了一个引用, 一个指针而已, 因为创建出来的连接文件只有几个字节.

绝大多数使用ln命令时, 使用的是-s选项, 可以称为符号链接, 或"软"链接. 使用-s标志的一个优点是它可以穿越文件系统来链接目录.

关于使用这个命令的语法还是有点小技巧的. 比如: ln -s oldfile newfile将对之前存在的oldfile产生一个新的连接, newfile.如果之前newfile已经存在的话, 将会产生一个错误信息.

使用链接中的哪种类型?

不论是那种类型的链接, 都提供了一种双向引用的手段 -- 也就是说, 不管你用文件的哪个名字对文件内容进行修改, 你修改的效果都即会影响到原始名字的文件, 也会影响到链接名字的文件. 当你工作在更高层次的时候, 才会发生软硬链接的不同. 硬链接的优点是, 原始文件与链接文件之间是相互独立的 -- 如果你删除或者重命名旧文件, 那么这种操作将不会影响硬链接的文件, 硬链接的文件讲还是原来文件的内容. 然而如果你使用软链接的话, 当你把旧文件删除或重命名后, 软链接将再也找不到原来文件的内容了. 而软链接的优点是它可以跨越文件系统(因为它只不过是文件名的一个引用, 而并不是真正的数据). 与硬链接的另一个不同是, 一个符号链接可以指向一个目录.链接给出了一种可以用多个名字来调用脚本的能力(当然这也适用于任何其他可执行的类型), 并且脚本的行为将依赖于脚本是如何被调用的.

一个很有趣的实例

#!/bin/bash
# hello.sh: 显示"hello"还是"goodbye"
#+          依赖于脚本是如何被调用的.

# 在当前目录下($PWD)为这个脚本创建一个链接:
#    ln -s hello.sh goodbye
# 现在, 通过如下两种方法来调用这个脚本:
# ./hello.sh
# ./goodbye


HELLO_CALL=65
GOODBYE_CALL=66

if [ $0 = "./goodbye" ]
then
  echo "Good-bye!"
  # 当然, 在这里你也可以添加一些其他的goodbye类型的命令.
  exit $GOODBYE_CALL
fi

echo "Hello!"
结果:
root@haitao-VirtualBox:~/test# ln -s hello.sh goodbye
root@haitao-VirtualBox:~/test# ls
goodbye  hello.sh  test1.sh  test2.sh
root@haitao-VirtualBox:~/test# ./hello.sh 
Hello!
root@haitao-VirtualBox:~/test# ./goodbye 
Good-bye!
root@haitao-VirtualBox:~/test# 

man, info

这两个命令用来查看系统命令或安装工具的手册和信息. 当两者都可用时, info页一般会比man页包含更多的细节描述.

先到这里了,O(∩_∩)O~

我的专栏地址:http://blog.csdn.net/column/details/shell-daily-study.html

待续。。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值