Shell¶
变量¶
# 变量赋值,无需声明
x=123 # 赋值符=左右不能有空格
# 值有空格时可使用引号括起来(还可以用反斜杠转义特殊字符:x0=ha\ ha)
x1='hello world' # 单引号中内容全部视作为纯文本
x2="$x1" # 双引号中的特殊字符保持原义,比如$
# 取消变量
unset x # x前不需要加$
# 查看所有变量
set
# 查看所有环境变量
env
# 引用变量
y=${x} # 可省略花括号
y=$(ls -al) # 引用命令(推荐)
y=`ls -al` # 引用命令
# 扩增变量
PATH=$PATH:/home/bin
PATH="$PATH":/home/bin
PATH=${PATH}:/home/bin # 推荐
数组¶
x = (a, b, c) # 可以用数组赋多个值,空格分隔
# 显示数组第一个元素
echo ${x[0]}
# 访问数组的所有元素
echo ${x[*]}
echo ${x[@]}
# 获取数组长度
echo ${#x[*]}
# 删除数组中元素
unset x[0]
输出¶
echo $y
echo ${#x} # 获取变量长度
echo ${x:n:m} # 切片
常用预定义变量(一般都大写)
echo $USER # 当前用户
echo $UID # 当前用户UID
echo $SHELL # 查看默认Shell
echo $PATH # 命令搜索路径
# 以下并不是环境变量,只是Shell的操作环境
echo $PS1 # 查看提示字符设置,即[root@localhost ~]内容的设置
echo $? # 显示上一条命令结果是否正确,正确返回0,否则返回1
echo $$ # 显示当前shell的PID,脚本检测时会用到
echo $0 # 显示当前进程的名称
echo $1
echo ${2-_} # 如果没有传入位置参数,默认赋值下划线
输入/输出重定向¶
"""
一个进程默认会打开三个文件描述符,通常用数字表示
0 标准输入stdin,输入自键盘
1 标准输出stdout,默认输出到终端
2 标准错误输出stderr,默认输出到终端
> 或 >1 输出重定向,把输出到终端的内容转储到文件
< 或 <0 输入重定向,从文件读取内容替代终端输入
& 表示后台运行
"""
# stdin重定向
wc -l < /etc/xxx # 统计输入行数
# stdout重定向
cmd > file # 将命令的输出从屏幕重定向到file文件,file若非空,则默认覆盖
cmd >> file # file若非空,则追加写入
# stderr重定向
cmd 2> file
cmd 2> /dev/nul # 将错误信息丢弃
# stdout与stderr全都重定向
cmd &> file # 最简写法
cmd > file 2>&1 # 另一种写法
"""
错误写法
cmd 2>&1 > file # 如果先把2指向1,即屏幕,再指向file,只是1指向了file,2其实没变,还是指向屏幕
cmd > file 2> file # 这样虽然可以都保存但会交叉的混在一起
"""
- 用cat创建文件
cat # 执行cat什么都不加则会让在命令行输入内容,ctrl+d退出
cat > file # 回车后在命令行输入内容,退出则内容自动保存到file中
# 输入重定向,是0<的简写
# 原本由键盘输入的数据,改由文件内容来代替
cat > file1 < file2 # 从file2读取内容写入到file1中,类似于复制
# 设置输入结束符
cat > file << "eof"
export
¶
由于子进程仅会继承父进程的环境变量,所以需要将自定义变量转成环境变量才可以在任意进程中使用:export x
(x前不需要加$)
比如想让自己写的可执行程序能在全局使用,需要把程序的路径添加到环境变量$PATH中
echo $PATH
"""
查看当前会在哪些路径搜索,冒号分隔,从左到右按顺序加载
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
"""
PATH=${PATH}:my_comd_path
echo $(export PATH)` >> ~/.bash_profile
source ~/.bash_profile # 重新加载环境变量配置文件使其生效
运算¶
expr 1 + 1 # 2,运算符两边必须加空格
expr 5 / 2 # 2
"""
运算符
&& 和
|| 或
"""
Shell Script¶
需要有x执行权限
指定解释器
#!/bin/bash
#!/usr/bin/env bash
(推荐)
运行时会产生新的子进程:
bash ./filename.sh
(推荐,不用赋予执行权限)./filename.sh
(必须声明,且要赋予执行权限)
运行时不会开启新进程,会影响当前shell,不用赋予执行权限:
source ./filename.sh
. ./filename.sh
(.是source的简写)
管道 |
¶
进程通信的重要方式,把前一条命令的执行结果传给后一个命令,还会为两个命令创建子进程,由于内部命令在子进程中无法将结果传给父进程,所以不建议在管道中使用内部命令
比如常跟grep连用:xxx | grep 参数 文件
最后更新:
2022-07-13