This is my study note of shell.

常见问题解决方式

1
2
3
1.正常定义数组报错Syntax error: "(" unexpected
解决方案:若此时语法不存在错误,则应该是缺少!/bin/bash,或者调用sh时是调用dash而不是bash,此时通过ll /bin/**sh可以查看。
此时只需要对.sh文件+x权限,同时通过./sh文件名直接运行文件就可以解决这个问题。

shell驱动基本语法

环境变量

1
2
3
4
5
6
7
8
9
10
11
12
PATH  		命令所示路径,以冒号为分割;
HOME 打印用户家目录;
SHELL 显示当前Shell类型;
USER 打印当前用户名;
ID 打印当前用户id信息;
PWD 显示当前所在路径;
TERM 打印当前终端类型;
HOSTNAME 显示当前主机名;
PS1 定义主机命令提示符的;
HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间;
RANDOM 随机生成一个 0 至 32767 的整数;
HOSTNAME 主机名

系统变量

1
2
3
4
5
6
$0 		当前脚本的名称;
$n 当前脚本的第n个参数,n=1,2,…9;
$* 当前脚本的所有参数(不包括程序本身);
$# 当前脚本的参数个数(不包括程序本身);
$? 令或程序执行完后的状态,返回0表示执行成功;
$$ 程序本身的PID号。

参数定义

1
2
3
4
5
6
# 等号两边不可以有空格,同时想要调用变量的话使用“$”,否则会当作字符串处理
a=10
echo $a
# 定义数组
a=(0 1 10 1)
echo ${a[0]}

输入参数

1
2
3
4
read 变量
read -p "描述" 变量
#例: read -p "this is a test" a
# echo $a

命令输入

1
2
3
4
5
# 第一种,直接使用
echo 1
# 第二种,赋值给变量
num = `echo 1`
$num

echo彩色输出

1
2
echo -e "\033[42;32m hello wordl \033[0m"
# 47表示底色,32m表示文字颜色

if

1
2
3
4
5
6
7
8
9
10
# 注意此时[]两侧必须有空格隔开,同时用“==”判断时,“==”两边也要用空格隔开
if [ a -eq 10 ]; then
# 错误用例:if[a==10]; then 正确:if [ a == 10 ]; then
...
elif
...
else
...
fi

while

1
2
3
4
while(condition)
do
...
done

for

1
2
3
4
for i in range(sed 1 10)
do
...
done

case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case 变量 in
conditon 1)
...
;;

condition 2)
...
;;

condition 3)
...
;;
esac

select

1
2
3
4
select i in http http1 http2
do
...
done

自启动

  • ls /lib/systemd/system
  • gedit rc-local.service
  • sudo chmod 777 /lib/systemd/system/rc-local.service
  • rc-local.service文末添加
    1
    2
    3
    [Install]
    WantedBy=multi-user.target
    Alias=rc-local.service
  • 查看系统中有无 /etc/rc.local 这个文件,没有则自己创建一个,并将需要使用的脚本放进去
    1
    如果在 /etc/rc.local 中添加的是 ./test.sh 这种类型的,要在末尾加上&,即./test.sh&
  • rc.local加权限 sudo chmod +x /etc/rc.local
  • 创建软链接
    1
    sudo ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/ 
  • reboot
  • 查看 /usr/local是否生成test.log