shell简介一

2019-04-29  本文已影响0人  李永开
  1. 在shell中,#代表注释
  2. 执行chmod +x ./sh_demo.sh,./sh_demo.sh可直接运行,不再需要sh ./sh_demo.sh这种写法
  3. 变量和值之间的=号不能有空格
name="siri"
age=8
  1. 使用readonly修饰只读变量
name="siri"
readonly name
  1. 使用unset删除变量
unset name

6.使用$取变量

${name}

7.sh脚本的第0个参数为脚本的名称

fileName=${0}
name=${1}
age=${2}
sex=${3}
echo "名称为:$name 年龄为:$age  性别为:$sex"

运行: ./sh_demo.sh n a s
输出: 名称为:n 年龄为:a  性别为:s

8.$?表示上一条命令是否执行成功.

返回值为0:表示命令成功
返回值为1:表示命令执行结果
返回值为2:表示命令执行状态返回码

9.参数相关

$#   参数个数
$*   参数列表 注意:把所有参数组合成一个字符串
$@   参数列表 注意:依次把所有的参数输出,不会组合成字符串
$$   获取当前shell进程ID

10.使用#获取字符串长度

name="siri"
echo ${#name}
输出:4

11.使用:字符串截取,从第1位开始截取2个字符

name="siri"
echo ${name:1:2}
输出:ir

12.打印数组的所有元素

arr=("1" "2" "3" "4")
echo ${arr[@]}
输出:1 2 3 4

13.打印数组的长度

arr=("1" "2" "3" "4")
echo ${#arr[@]}
输出:4

14.算数运算符,需要用expr,不能直接加

加减法:
a=1
b=2
c=`expr $a + $b`
echo $c
打印:3


乘法:需要加\
a=3
b=5
c=`expr $a \* $b`
echo $c
打印:15


除法:
a=15
b=5
c=`expr $a / $b`
echo $c
打印:3

取余:
a=14
b=5
c=`expr $a % $b`
echo $c
打印:4

  1. 逻辑运算符&& ||,中括号[]中间一定要有空格
a=1
b=5
if [ $a -lt 2 ] && [ $b -eq 6 ]
then
echo "成立"
else
echo "不成立"
fi
打印:不成立
  1. 使用break跳出循环
    *break 1代表退出1层循环, 默认为1
    *break 2代表退出2层循环
  2. 逐行读取文件
cat a.txt | while read line
do
    echo "${line)"
done
  1. print的使用
    printecho都是用来输出内容的,区别在于echo为标准输出,print为自定义输出.
printf "%-10s %-.4f \n" siri 3.333
打印:siri       3.3330
解释:%为占位符,-为左对齐,10代表长度,s代表字符串,.4代表小数点后四位
  1. 在默认的情况下,wc将计算指定文件的行数、字数,以及字节数。
wc sh_demo.sh
输出:13      24     110 sh_demo.sh
  1. 重定向
    <输入重定向
    << 创建文件
    >输出重定向,会替换
    >>不会替换,只会追加内容
  2. 管道的使用
echo "1+1" | bc
打印:2
解释:将"1+1"这个式子放到bc(一个计算器)里面执行
  1. 将控制台的错误信息输出到文件
cd 不存在的路径 2 > error.txt
解释:加个数字 2  就好了,2 代表异常

cd 存在的的路径  不存在的路径 2> error.txt > right.txt
解释:将错误的信息和正确的信息输出到**不同**的文件

cd 存在的的路径  不存在的路径  &> errorAndRight.txt
解释:将错误的信息和正确的信息输出到**同一个**文件
  1. 临时重定向
file.sh
{
    echo "hello"  >&2 
    echo "world"
}
执行sh file.sh > error.txt,
发现error.txt中只有hello,------因为使用 >&2 将 "hello"标记为异常了
world则在控制台输出.
  1. 使用exec永久重定向
file.sh
{
    exec 1> output.txt
    echo "hello" 
    echo "world"
}
执行sh file.sh,发现所有的内容都写到output.txt里面了.

保存错误信息

file.sh
{
    exec 1> output.txt
    echo "hello" 
    echo "world"

    exec 2> error.txt
    echo "find error" >&2
}
执行sh file.sh,发现"hello"  "world"写到output.txt里面了.
"find error"写到error.txt里面了.
  1. 使用exec 0 < input.txt来重定向输入
exec 666> output.txt
echo "hello"
echo "world" >&666
echo "yes"
结果:打印了 "hello"和"yes",而"world"则输出到了output.txt.
  1. 恢复重定向
exec 3>&1
exec 1> output.txt
echo "hello"

exec 1>&3
echo "world"
解释:exec 3>&1将原来的 exec 3 替换为 exec 1,"hello"出现在output.txt里面.
exec 1>&3将exec 1 替换为 exec 3,所以"world"不会出现在output.txt里面.
  1. 关闭文件描述符,就不能再写入了
exec 3>&-
  1. /dev/null路径,帮助我们不用在控制台打印内容,并且自动清空内容
cat a.txt > /dev/null
没有输出,  /dev/null也没有值

或者
cat /dev/null > a.txt
这样可以清空a.txt
  1. 创建临时文件
mktemp a.XXXXXX
解释:本地随机生成生成一个临时文件(必须大写的X)
mktemp -t a.XXXXXX
输出:/var/folders/40/gl3_xjt576vg008mqrpdqzdh0000gn/T/a.XXXXXX.hOEHe1td
解释:生成一个系统的临时目录
  1. 创建临时目录
mktemp -d a.XXXXXX
上一篇下一篇

猜你喜欢

热点阅读