echo
打印字符
>
重定向,覆盖前文
>>
重定向,文尾插入
1.hello world
$ vim hello.sh
bash中内容为
#!/bin/bash
# This is a comment
echo Hello World
第一行:表明该文件是一个 BASH 程序,需要由 /bin
目录下的 bash 程序来解释执行。这行要放在脚本的行首并且不要省略。
第二行:在 BASH 程序中从“#”号(注意:后面紧接着是“!”号的除外)开始到行尾的部分均被看作是程序的注释。
第三行:第三行的 echo 语句的功能是把 echo 后面的字符串输出到标准输出中去。由于 echo 后跟的是 "Hello World" 这个字符串,因此 "Hello World"这个字串就被显示在控制台终端的屏幕上了。需要注意的是 BASH 中的绝大多数语句结尾处都没有分号。
运行bash脚本的方法
# 使用shell来执行
$ sh hello.sh
# 使用bash来执行
$ bash hello.sh
使用.来执行
$ . ./hello.sh
使用source来执行
$ source hello.sh
还可以赋予脚本所有者执行权限,允许该用户执行该脚本
$ chmod u+rx hello.sh
$ ./hello.sh
2.重定向
#!/bin/bash
echo "Hello World" > my.txt
3.使用脚本清除/var/log下的log文件
$ vim cleanlogs.sh
#!/bin/bash
# 初始化一个变量
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > wtmp
echo "Logs cleaned up."
exit
- 运行脚本前,先使用
sudo chmod +x cleanlogs.sh
授予脚本执行权限,然后再看看/var/log/wtmp
文件内是否有内容。运行此脚本后,文件的内容将被清除。 - 由于脚本中含有对系统日志文件内容的清除操作,这要求要有管理员权限.不然会报permission denied错误,使用
sudo
命令调用管理员权限才能执行成功:
$ sudo ./cleanlogs.sh
sudo cat /dev/null > /var/log/wtmp
一样会提示权限不够,因为sudo只能让cat命令以sudo的权限执行,而对于>这个符号并没有sudo的权限,我们可以使用
sudo sh -c "cat /dev/null > /var/log/wtmp "
此命令以超级用户身份运行“sh”,让整个命令都具有sudo的权限执行
(sh实用程序是一个命令语言解释器,它将执行从命令行字符串,标准输入或指定文件读取的命令。)
4.echo
- 输出字符串
echo 123
echo “Hi!”
- 输出文本内容
echo my.txt
-
-n
表示不换行输出
echo -n "Hi!"
- 执行命令
echo ` ipconfig `
上面的执行结果可能是排成一行
可以使用
echo "`ipconfig`"
- 带有转移字符
- 常用的转义字符如下:
\b
退格,但\b后必须有字符
\c
不换行输出
\t
tab
\\
\本身
\n
换行
\f
换行
\r
光标移至行首 - 执行转义需要加
-e
echo -e 123\\456 ->123\456
http://www.zsythink.net/archives/96/
5.bash特殊字符
-
#
$ vim test.sh
输入如下代码,并保存。(中文为注释,不需要输入)
#!/bin/bash
echo "The # here does not begin a comment."
echo 'The # here does not begin a comment.'
echo The \# here does not begin a comment.
echo The # 这里开始一个注释
echo $(( 2#101011 )) # 数制转换(使用二进制表示),不是一个注释,双括号表示对于数字的处理
执行脚本,查看输出
$ bash test.sh
The # here does not begin a comment."
The # here does not begin a comment.'
The # here does not begin a comment.
The
43
-
;
- 命令分隔符
使用分号(;)可以在同一行上写两个或两个以上的命令。
$ vim test2.sh
输入如下代码,并保存。
#!/bin/bash
echo hello; echo there
filename=ttt.sh
if [ -e "$filename" ]; then # 注意: "if"和"then"需要分隔,-e用于判断文件是否存在
echo "File $filename exists."; cp $filename $filename.bak
else
echo "File $filename not found."; touch $filename
fi; echo "File test complete."
执行脚本
$ bash test2.sh
查看结果
$ ls
解释说明
上面脚本使用了一个if分支判断一个文件是否存在,如果文件存在打印相关信息并将该文件备份;如果不存在打印相关信息并创建一个新的文件。最后将输出"测试完成"。
-
;;
- 终止case选项
使用双分号(;;)可以终止case选项。
$ vim test3.sh
输入如下代码,并保存。
#!/bin/bash
varname=b
case "$varname" in
[a-z]) echo "abc";;
[0-9]) echo "123";;
esac
执行脚本,查看输出
$ bash test3.sh
abc
解释说明
上面脚本使用case语句,首先创建了一个变量初始化为b,然后使用case语句判断该变量的范围,并打印相关信息。如果你有其它编程语言的经验,这将很容易理解。
-
.
等价于 source 命令
bash 中的 source 命令用于在当前 bash 环境下读取并执行 FileName.sh 中的命令。
$ source test.sh
Hello World
$ . test.sh
Hello World
-
'
&"
1.双引号(")
"STRING" 将会阻止(解释)STRING中大部分特殊的字符。
2.单引号(')
'STRING' 将会阻止STRING中所有特殊字符的解释,这是一种比使用"更强烈的形式。
-
区别
这里举一个例子,能够更加生动的说明
同样是$HOME,单引号会直接认为是字符,而双引号认为是一个变量