驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
shell中可能被忽视几个知识点
/  

shell中可能被忽视几个知识点

变量

Local 表示局部变量

默认不加任何参数的是全局变量

$num表示变量的获取,在特殊形式下可以使用${num}来表示。

如果用单引号扩其变量,表示的是原封不动的输出。

权限

通过ls -l命令可以查看某个文件具备的权限,比如

touch 1.sh
chmod +x 1.sh
ls -l

那么展示的结果可能是

-rwxrwxr-x 1 uewell uewell 0 Feb 21 22:42 1.sh

其中第一列是关键的信息-rw-rw-r--,抛开第一个-不看,后面的每 3 个分为一组,那么此时可以分为如下所示。

rwx #拥有者权限
rwx #所属组权限
r-x #其他用户权限
  • r表示read,即读的权限,可以用 4 代替
  • w表示 write,即写的权限,可以用 2 代替
  • x表示execute,即执行权限,可以用 1 代替

需要注意的是,当我们创建一个文件之后,默认是不具备 x 权限的,但是上述指令中通过了chmod +x xx.sh为文件 添加了执行权限。

脚本执行

# 方法 1:具备x权限的时候
chmod +x test.sh
./test.sh

# 方法 2:通过 sh 执行
sh test.sh

# 方法 3
source test.sh

$的常用含义

  • $?表示上一条命令执行结果。通常 1 表示成功,0 表示失败
  • $0表示当前执行的 shell 脚本的名称
  • $1-$9表示当前第 n个参数值

举个例子

if [ $? -nq 0 ]
  echo "success"
else 
	echo "fail"

奇怪符号组合

  • > 将左边的内容覆盖到右边的文本源中,比如ifconfig > ip.log
  • >> 功能同上,不过不是覆盖,是追加append

问题: $'\r': command not found

方法1:

yum -y install dos2unix
dos2nuix install.sh
sh install.sh

方法 2:

sed -i 's/\r//' install.sh
sh install.sh

脚本中使用绝对路径

在编写 shell 脚本中,切记不能使用相对路径,一定要使用功能绝对路径,否则很容易出现一些意外情况。

我在编写一个脚本的时候,当前目录下有一个路径db/xx.data,在 shell脚本中有类似这么一行指令

path="db/xx.data"
text=$(cat ${path})
echo "text:${text}"

怎么样都无法获取到xx.data中的内容,经过查阅资料发现:脚本中使用相对路径是大忌,修改如下:

# 获取当前 shell 脚本执行路径
BASE_DIR=$(cd "$(dirname "$0")"; pwd)
# 拼接完成的路径
path="${BASE_DIR}/db/xx.data"
text=$(cat ${path})
echo "text:${text}"
骐骥一跃,不能十步。驽马十驾,功在不舍。