shell脚本 - chmod、find、后台命令、文件名置换、shell输入输出、&&、||
1文件安全与权限
1.1 chmod 命令的一般格式为:
chmod [who] operator [permission] filename
举例:
命 令 结 果 含 义
chmod a-x myfile rw- rw- rw- 收回所有用户的执行权限
chmod og-w myfile rw- r-- r- - 收回同组用户和其他用户的写权限
chmod g+w myfile rw- rw- r- - 赋予同组用户写权限
chmod u+x myfile rwx rw- r- - 赋予文件属主执行权限
chmod go+x myfile rwx rwx r- x 赋予同组用户和其他用户执行权限
ls -l 第一个字符的意思:
d目录。
l符号链接(指向另一个文件)。
s套接字文件。
b块设备文件。
c字符设备文件。
p命名管道文件。
-普通文件,或者更准确地说,不属于以上几种类型的文件
1.2 chmod绝对命令模式
chmod [mode] file
例子: chmod 777 myflie
1.3 符号链接 ln
ln [-s] source_path target_path
2 find命令
F i n d命令的一般形式为:
find pathname -options [-print -exec -ok]2.1 find命令选项
-name按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使 f i n d命令不在当前指定的目录中查找,如果同时使用了- d e p t h选项,那么- p r u n e选项将被f i n d命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件,- n表示文件更改时间距现在n天以内, + n
表示文件更改时间距现在 n天以前。F i n d命令还有- a t i m e和- c t i m e选项,但它们都和- m t i m e选项相似,所以我们在这里只介绍- m t i m e选项。
例子:
想要在当前目录及子目录中查找所有的‘* . t x t’文件,可以用:
$ find . -name "*.txt" -print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name "[A-Z]*" -print
想要在/ e t c目录中查找文件名以h o s t开头的文件,可以用:
$ find /etc -name "host*" -print
3 后台执行命令
3.1 crontab命令
c r o n t a b的格式:
分< >时< >日< >月< >星期< >要运行的命令
例子:30 21* * * /apps/bin/cleanup.sh上面的例子表示每晚的2 1 : 3 0运行/ a p p s / b i n目录下的c l e a n u p . s h。45 4 1,10,22 * * /apps/bin/backup.sh上面的例子表示每月1、1 0、2 2日的4 : 4 5运行/ a p p s / b i n目录下的b a c k u p . s h。c r o n t a b命令的一般形式为:
Crontab [-u user] -e -l -r
其中:
-u用户名。
-e编辑c r o n t a b文件。
-l列出c r o n t a b文件中的内容。
-r删除c r o n t a b文件。
如果使用自己的名字登录,就不用使用如果使用自己的名字登录,就不用使用- u选项,因为在执行c r o n t a b命令时,该命令能够知道当前的用户。
3.2 at 命令
a t命令允许用户向c r o n守护进程提交作业,使其在稍后的时间运行。这里稍后的时间可能
是指1 0 m i n以后,也可能是指几天以后。
a t命令的基本形式为:
at [-f script] [-m -l -r] [time] [date]
其中
-f script 是所要提交的脚本或命令。
-l 列出当前所有等待运行的作业。a t q命令具有相同的作用。
-r 清除作业。为了清除某个作业,还要提供相应的作业标识(I D);有些U N I X变体只接受a t r m作为清除命令。
-m 作业完成后给用户发邮件。
time at命令的时间格式非常灵活;可以是H、H H . H H M M、H H : M M或H : M,其中H和M分别是小时和分钟。还可以使用a . m .或p . m .。
date 日期格式可以是月份数或日期数,而且a t命令还能够识别诸如t o d a y、 t o m o r r o w这样的词。 、
例子:at 3.00pm tomorrow -f /apps/bin/db.sh
db.sh的脚本将在明天下午3:00 运行;
time:可以是 at 6.45am May 12;
3.3 &命令
命令& //将命令的东西在后台执行;
ps命令查看进程
kill 命令杀死进程
3.4 nohup命令
nohup command &
退出账户时。该进程还不会结束;
4 文件名置换
shell中的特殊字符:
* 匹配文件名中的任何字符串,包括空字符串。
? 匹配文件名中的任何单个字符。
[...] 匹配[ ]中所包含的任何字符。
[!...] 匹配[ ]中非感叹号!之后的字符。
当s h e l l遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样用户就可以用它们来匹配相应的文件名。
4.1 使用 *
例子:
ls app*
cd cron.w*
4.2 使用?
ls ??R*
4.3 使用[...] [!...]
使用[ . . . ]可以用来匹配方括号[ ]中的任何字符。在这一方法中,还可以使用一个横杠-来连接两个字母或数字,以此来表示一个范围。在下面的例子中,列出了以i或o开头的文件名:$ ls [sp]*
pinmux_hi3518.sh sysctl_hi3518.sh配以第一个字母是n,第二个字母是a到o,的对象;$ls n[a-o]*
nano nc nc.openbsd netcat netstat nfs-kernel-server nisdomainname配以第一个字母是n,第二个字母不是a到o,的对象;$ ls n[!a-o]*
ntfs-3g ntfscat ntfsdecrypt ntfsls ntfswipe
ntfs-3g.probe ntfsck ntfsdump_logfile ntfsmftalloc
ntfs-3g.secaudit ntfscluster ntfsfix ntfsmove
ntfs-3g.usermap ntfscmp ntfsinfo ntfstruncate
5 shell 输入、输出
• 使用标准输入、标准输出及标准错误。
• 重定向标准输入和标准输出。5.1 echo
使用echo命令可以显示文本行或变量,或者把字符串输入到文件。它的一般形式为:
echo string例如:
$echo "jsdlfkj $HOME"$echo
特殊字符:
换行:\n跳格符:\t
$ echo -e "sdfoisdfsk \t dsf \t jkfj \n jsdlkfj \n lkj"sdfoisdfsk dsf jkfjjsdlkfjlkj
重定向符号>:追加一个文件结尾,这意味着不会覆盖原有内容>>:
[email protected]:~$ echo "sdfsdf dsf \tdsfj\n dfj\njsdkf\t\tjskf \n"> 1.txt
[email protected]:~$ cat 1.txt
sdfsdf dsf \tdsfj\n dfj\njsdkf\t\tjskf \n
[email protected]:~$ echo -e "sdfsdf dsf \tdsfj\n dfj\njsdkf\t\tjskf \n"> 1.txt
[email protected]:~$ cat 1.txt
sdfsdf dsf dsfj
dfj
jsdkf jskf
[email protected]:~$ echo -e "sdfsdf dsf \tdsfj\n dfj\njsdkf\t\tjskf \n"> 1.txt
[email protected]:~$ cat 1.txt
sdfsdf dsf dsfj
dfj
jsdkf jskf
[email protected]:~$ echo -e "sdfsdf dsf \tdsfj\n dfj\njsdkf\t\tjskf \n">> 1.txt
[email protected]:~$ cat 1.txt
sdfsdf dsf dsfj
dfj
jsdkf jskf
sdfsdf dsf dsfj
dfj
jsdkf jskf
5.2 read
可以使用r e a d语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。如果只指定了一个变量,那么r e a d将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车。
5.3 cat
功能:显示文件内容、创建文件、显示控制符;$ cat myfile1 myfile2 myfile3 > bigfile //将三个文件内容的输出,重定向到新文件中;如果希望创建一个新文件,并向其中输入一些内容,只需使用 c a t命令把标准输出重定向到该文件中,这时c a t命令的输入是标准输入 — 键盘,你输入一些文字,输入完毕后按< C T R L - D >结束输入。这真是一个非常简单的文字编辑器!
5.4 管道
可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠 |表示。它的一般形式为:
命令1 |命令2
其中|是管道符号。
5.5 tee
t e e命令作用可以用字母 T来形象地表示。它把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再合适不过了。它的一般形式为:
tee -a files
其中,-a表示追加到文件末尾。
[email protected]:~$ who | tee who.out
wooya tty7 2017-09-25 16:08
wooya pts/0 2017-09-25 16:08 (:0.0)
[email protected]:~$ cat who.out
wooya tty7 2017-09-25 16:08
wooya pts/0 2017-09-25 16:08 (:0.0)
5.6 标准输入、输出、错误
5.7 文件重定向
表中的command是我们的linux命令;如:ls cat 等;使用举例:
$ ls >ls.out可以指定命令的标准输入。在 a w k一章就会遇到这样的情况。下面给出一个这样的例子:
$ sort < name.txt
5.8 exec
e x e c命令可以用来替代当前 s h e l l;换句话说,并没有启动子 s h e l l。使用这一命令时任何现有环境都将会被清除,并重新启动一个s h e l l。它的一般形式为:
exec command
其中的c o m m a n d通常是一个s h e l l脚本。
我所能够想像得出的描述 e x e c命令最贴切的说法就是:它践踏了你当前的s h e l l。
5.9 使用文件描述符(?)
6 命令执行顺序
6.1 &&
使用& &的一般形式为:
命令1 && 命令2
这种命令执行方式相当地直接。 & &左边的命令(命令 1)返回真(即返回0,成功被执行)
后, & &右边的命令(命令 2)才能够被执行;换句话说, “如果这个命令执行成功 & &那么执
行这个命令”。$ mv /apps/bin /apps/dev/bin && rm -r /apps/bin
6.2 ||
使用| |的一般形式为:
命令1 || 命令2
| |的作用有一些不同。如果 | |左边的命令(命令 1)未执行成功,那么就执行 | |右边的命令
(命令2);或者换句话说, “如果这个命令执行失败了 || 那么就执行这个命令”。
在这里不只可以使用系统命令;这里我们首先对 m o n t h _ e n d . t x t文件执行了一个名为 c o m e t
的s h e l l脚本,如果该脚本未执行成功,该 s h e l l将结束。
$ comet month_end.txt || exit
6.3 用()和{ }将命令结合在一起
如果希望把几个命令合在一起执行, s h e l l提供了两种方法。既可以在当前 s h e l l也可以在
子s h e l l中执行一组命令。
(命令1;命令2;. . .)
{命令1;命令2;. . . }