1.第一个helloword程序
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好
命令:vi helloword.sh
#!/bin/bash
echo "Hello World !"
编辑好后,怎么执行 ?
第一种方法:
sh helloword.sh
第二种方法:
./helloword.sh
但是报错,权限不足,当你输入./hell时也没有自动提示
-rw-------. 1 root root 997 3月 18 2020 anaconda-ks.cfg
-rw-r--r--. 1 root root 34 9月 19 08:55 hellword.sh
drwxr-xr-x. 2 root root 4096 9月 18 18:33 myslq
[root@localhost ~]# ./hellword.sh
-bash: ./hellword.sh: 权限不够
解决方法:在该文件上加上可执行权限
chmod +x hellword.sh
然后再执行./hellword.sh,发现可以正常执行了,也有自动提示了
-rw-------. 1 root root 997 3月 18 2020 anaconda-ks.cfg
-rwxr-xr-x. 1 root root 34 9月 19 08:55 hellword.sh
drwxr-xr-x. 2 root root 4096 9月 18 18:33 myslq
[root@localhost ~]# ./hellword.sh
Hello World !
除了显式地直接赋值,还可以用语句给变量赋值,如
查看目录下的文件
#!/bin/bash
for file in `ls /etc`;
#for file in $(ls /root/aaa/bbb);
do
echo $file
done;
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
#!/bin/bash
myname="吴占喜"
echo $myname
echo ${myname}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
推荐给所有变量加上花括号,这是个好的编程习惯。
#!/bin/bash
for skill in Ada Coffe Action Java;
do
echo "I am good at ${skill}Script"
done
输出结果如下;
I am good at AdaScript
I am good at CoffeScript
I am good at ActionScript
I am good at JavaScript
如果不给skill变量加花括号,写成echo "I am good at s k i l l S c r i p t " , 解 释 器 就 会 把 skillScript",解释器就会把 skillScript",解释器就会把skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
I am good at
I am good at
I am good at
I am good at
已定义的变量,可以被重新定义,如:
#!/bin/bash
myname="科比"
echo ${myname}
myname="吴占喜"
echo ${myname}
输出:
科比
吴占喜
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
#!/bin/bash
myname="科比"
readonly myname
myname="wzx"
输出:
test4.sh:行4: myname: 只读变量
删除变量
使用 unset 命令可以删除变量。语法:
语法
unset variable_name
#!/bin/sh
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl
这种情况下是什么都不会输出的
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
执行结果:
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
获取字符串长度
string="abcdef"
echo ${#string}
#输出 6
提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="abcdefg"
echo ${string:1:4}
# 输出 bcde
注意:第一个字符的索引值为 0。
查找子字符串
查找字符 d或 l 的位置(哪个字母先出现就计算哪个):
string="god id girl"
echo `expr index "$string" dl`
输出:3
注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦
Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
实例
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
输出如下;
[root@hadoop1 ~]# sh test10.sh 1 2 3
Shell 传递参数实例!
执行的文件名:test10.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
另外,还有几个特殊字符用来处理参数:
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
函数:
无返回值的情形:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
function ceshifunction(){
echo "测试第一个函数的执行"
}
echo "我的函数开始执行了"
ceshifunction
echo "我的函数执行结束了"
输出结果如下;
[root@hadoop1 ~]# sh test13.sh
我的函数开始执行了
测试第一个函数的执行
我的函数执行结束了
有返回值的情形
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
function ceshireturn(){
echo "测试两个数据相加"
echo "请输入第一个参数"
read a
echo "请输入第二个参数"
read b
echo "两个数字分别为 $a 和 $b !"
return $(($a + $b ))
}
ceshireturn
echo "输入的两个数字之和为 $? !"
输出结果如下;
测试两个数据相加
请输入第一个参数
34
请输入第二个参数
45
两个数字分别为 34 和 45 !
输入的两个数字之和为 79 !