1 2 3 4 5 6 7 8 9 10 11 12 13
| echo $SHELL
echo $0
/bin/sh
exit
|
编写shell脚本
脚本文件可以是任何扩展名,但是约定为sh
Shell脚本文件的第一行一般是一个#!,后面加上bin/bash用来表示这个脚本文件使用的是Bash解释器,用其他的解释器也可以替换,比如bin/zsh
1 2 3 4 5
| #!/bin/bash
echo "Hello Shell" date#显示时间 whoami#显示当前用户
|
编辑完保存一下并执行
1 2
| chmod a+x hello.sh#设置权限 ./hello.sh#执行
|
Shell脚本也是支持函数的,Shel脚本中的变量默认是全局的,它的作用域是从定义的地方开始一直到脚本结束,如果想要在函数中定义一个局部变量的话就需要在变量的前面加上一个local关键字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #!/bin/bash
is_prime(){ local num=$1 if[ $num -lt 2 ];then return 1#返回1,表示不是素数 fi for((i=2;i*i<=num;i++));do if[$((num%i))-eq 0 ]; then return 1#返回1,表示不是素数 fi done return 0#返回0,表示是素数 }
|

然后直接执行就行了
简单使用
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash
echo "请输入您的姓名:" read name#读取输入的名字赋给name echo "您好,$name"
编辑完后可以执行,执行方法有以下两种 bash game.sh ./game.sh#这种方式要添加执行权限 chmod +x game.sh
|
我们也可以给这个脚本文件传递一些参数,这些参数可以在脚本里使用$加上数字序号的方式来引用($1、$2、$3等)
修改代码
1 2 3 4 5 6 7
| #!/bin/bash
echo "请输入您的姓名:"
name=$1 channel=$2 echo "您好,$name,欢迎来到#channel"
|

可以把这些信息保存到一些变量中让脚本文件自动读取这些信息,也就是使用环境变量,这些变量是系统预先定义好的,我们也可以自己定义变量,
1 2 3 4 5 6
| name=老杨 channel=geekhour echo $name#查看值,变成了老杨,但这里只是普通变量,不属于环境变量,只在当前shell会话有效,脚本文件直接引用会无法获取值
export name=老杨
|
shell在启动时会读取一些配置文件,用ls -a可以看到下面这两个文件,.profile是在用户登录的时候执行的并且只执行一次,而.bashrc文件是在每次新打开一个终端或者新建一个Shell会话的时候执行的,这两个都可以。不同Shel的配置文件可能会有一些差异,比如zsh的配置文件是.zshrc文件

通常.bash profile里面会调用.bashrc,所以一般推荐把环境变量放到.bashrc文件中,这样就可以保证每次新打开一个终端的时候都可以获取到这些环境变量了
系统根目录下也会有一些系统级别的配置文件,比如根目录etc文件夹下的profile和bashrc文件等等,这些文件里面存储的环境变量是对所有用户都有效的
1 2 3 4 5 6 7 8
| ls /etc/bash vi .bashrc
export name=老杨 export channel=GeekHour
source .bashrc . .bashrc#或者这个,或者退出重进
|
猜数字小游戏
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| shuf -i 1-10 -n 1
vi game.sh
echo "请输入您的姓名:" echo "您好,$name,欢迎来到#channel"
number=$(shuf -i 1-10 -n 1) echo $number echo "请输入一个1-10之间的数字" read guess#读取 变量名
if [[ $guess -eq $number ]];then echo "猜对了" elif [[ $guess -lt $number ]];then echo "小了" else echo "大了" fi :wq
|

if语句格式:if后面加上条件语句,这个条件需要使用两个中括号把它括起来,后面再加上一个分号和then,然后在下面加上一些命令,这些命令就会在这个条件成立的时候被执行,最后再加上一个fi来结束这个if语句
上面的脚本只能执行一次,只要猜对了就结束了,如果想一直执行就是循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| vi game.sh
echo "请输入您的姓名:" echo "您好,$name,欢迎来到#channel"` number=$(shuf -i 1-10 -n 1) echo $number
while true
do echo "请输入一个1-10之间的数字" read guess#读取 变量名
if [[ $guess -eq $number ]];then echo "恭喜你猜对了!是否继续?(y/n):" read choice if [[ $choice = "y" ]] || [[ $choice = "Y" ]];then continue else break fi elif [[ $guess -lt $number ]];then echo "小了" else echo "大了" fi
done :wq
|
随机数的取法还有下面这种
1 2
| echo $((RANDOM % 10 + 1))
|