Shell笔记1

疑问

运行脚本为什么一定要 ./test.sh** **而不是 test.sh

解答

和运行其它二进制的程序一样 直接写 test.sh
linux 会去 PATH 里寻找有没有叫 test.sh 的文件
而只有 /bin /sbin /usr/bin /usr/sbin 等在 PATH 里
你的当前目录通常不在 PATH 里
所以写成 test.sh 是会找不到命令的
./test.sh 告诉 linux 说 就在当前目录找

变量

1
2
3
4
5
6
7
8
9
10
11
# 赋值
user=123
# 二次赋值
user=222
# 使用变量
echo $user/${user}
# 删除变量
unset user
# 只读变量
r=1
readonly r

变量注意事项

  • 变量名和等号之间不能有空格
  • 使用变量的时候 变量名外面的花括号是可选的「为了帮助解释器识别变量的边界」
  • 使用变量的时候才加美元符 $ 「赋值的时候不用加」
  • 使用 readonly 命令可以将变量定义为只读变量 只读变量的值不能被改变
  • unset 命令不能删除只读变量 「其他变量都可以」

shell变量作用域

  • *局部变量 *「局部变量在脚本或命令中定义 仅在当前shell实例中有效 其他shell启动的程序不能访问局部变量」
  • 环境变量
    • 「使用 export 命令将全局变量导出的变量」
    • 「环境变量被创建时所处的 Shell 进程称为父进程 创建 Shell 子进程最简单的方式是运行 bash 命令」
    • 「两个没有父子关系的 Shell 进程是不能传递环境变量的 并且环境变量只能向下传递而不能向上传递 即“传子不传父”」
  • 全局变量 「在 Shell 中定义的变量 默认就是全局变量 在当前的整个 Shell 进程中都有效 在不同 Shell 进程中的互不相关性」

字符串

单双引号区别

  • 单引号里的任何字符都会原样输出 单引号字符串中的变量是无效的
  • 单引号字串中不能出现单独一个的单引号「对单引号使用转义符后也不行」 但可成对出现 作为字符串拼接使用
  • 双引号里可以有变量
  • 双引号里可以出现转义字符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 拼接字符串
user=123
# 双引号使用
echo "hello, "$user" !"
echo "hello, ${user} !"
# 单引号使用
echo 'hello,'$user' !'
# 无效用法
echo 'hello, ${user} !'

# 输出结果
hello, 123 !
hello, 123 !
hello, 123 !
hello, ${user} !

字符串操作

1
2
3
4
5
6
7
8
9
10
11
12
# 获取字符串长度
echo ${#string}

# 提取子字符串 第2个字符到第5个字符
echo ${string:1:4}

# 查找子字符串 使用反引号 查找l字符或o字符 返回最先出现的字符的位置
# 此处返回3
# 计数从1开始
echo `expr index "hello shell" "lo"`
# MacOS使用
echo "hello shell" | sed -n "s/["lo"].*//p" | wc -c

注意: macOS中无法这么使用expr index String Char命令 会提示expr: syntax error
Apple社区里有完美的答复 https://discussions.apple.com/thread/923299
Linux中的expr通常是GNU expr
Mac OS X使用BSD expr
它没有index命令 但是可以安装/编译GNU expr使用它

1
2
3
4
# 知乎网友提供了个替代方案
string="hello world"
temp=${string%%wo*}
echo $((${#temp}+1))

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 数组定义 可折行
array_name=(value0 value1 value2 value3)
# 可单独定义数组某个分量
array_name[3]=value

# 读取数组 n为下标
value=${array_name[n]}
# 获取数组中的所有元素 用 @ 或 *
echo ${array_name[@]}

# 取得数组元素的个数 用 @ 或 *
length=${#array_name[@]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 这是个注释

# 可使用EOF或其他符号 用于多行注释
:<<EOF
这是个注释
EOF

:<<'
这是个注释
'

:<<!
这是个注释
!

最后

执行shell脚本的时候 要记得添加执行权限

1
sudo chmod +x ./xxx.sh
# SHELL

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×