shell programming


Author: yifei / Created: July 16, 2017, 9:38 a.m. / Modified: July 16, 2017, 5:39 p.m. / Edit

Shell 脚本编程

本来想自己写一个,后来看了看这篇不错,直接翻译一下算了。。

http://learnxinyminutes.com/docs/bash/

Bash 是 Unix Shell 的一种,而且也是一种GNU操作系统的Shell,而且也是 Linux 和 OS X 的默认 Shell,下面的所有例子都可以作为 Shell 脚本的一部分或者直接在 Shell 种执行

#!/bin/bash
# 脚本的第一行叫做 Shebang,可以用来告诉操作系统如何执行这个脚本。
# 参考:
# 正如你所猜,注释以#开头,shebang 也是一行注释

# 简单的 Hello,World 例子
echo Hello world!

# 每个命令从一个新行开始,或者一个分号之后
echo 'This is the first line'; echo 'This is the second line'

# 如下声明一个变量
VARIABLE="Some thing"

# 但是不能像这样
VAIRABLE = "Some string"
# bash 会认为VARIABLE是一个必须执行的命令,然后因为找不到这个命令而报错

# 使用变量
echo $VARIABLE
echo "$VARIABLE"
echo '$VARIABLE'
# 当你使用变量本身的时候 - 赋值,输出,或者其他 - 不用写出$,当你想要使用变量的值的时候,请加上$。
# 注意在单引号中间的变量不会展开

# 变量中的字符串替换
echo ${VARIABLE/Some/A}
# 把变量中第一次出现 "Some" 替换为 "A"

# 子字符串
echo ${VARIABLE:0:7}
# 返回前7个字符

# 变量默认值
echo ${FOO:-"Default value of FOO is missing or empty"}
# 当 null(FOO=) 或者 空字符串 (FOO="")时成立,零 (FOO=0)时候返回0

# 内置变量:
# 用一些很有用的内置变量,比如:
echo "Last program return value: $?" # 上一个程序的返回值
echo "Script's PID: $$" # 脚本的PID
echo "Number of arguments: $#" # 参数的数量
echo "Script arguments: $@" # 脚本的参数
echo "Scripts arguments seperated in different arguments: $1 $2..." # 分散在不同变量中的脚本的参数

# 读取用户输入
echo "What's your name?"
read NAME # 注意我们并没有声明新的变量
echo Hello, $NAME!

# 常见的 if 结构
if [ $name -ne $USER ]
then 
    echo  "Your name isn't your username"
else
    echo "Your name is your username"
fi

# 条件执行
echo "Always executed" || echo "Only executed if first command fails"
echo "Always executed" && echo "Only executed if first commans does NOT fail"

# 若要在if语句中使用 || 和 &&,那么需要使用多个方括号:
if [ $NAME == "Steve" ] && [ $AGE -eq 15 ]
then
    echo "This will run if $NAME is Steve AND $AGE is 15"
fi

# 译者注:最好使用[[ ]],而不是[],这样有更好的兼容性

if [ $NAME == "Steve" ] || [ $NAME == "Zach" ]
then 
    echo "This will run if $NAME is Daniya OR Zach"
fi

# 表达式使用如下形式
echo $(( 10 + 5 ))

# 与其他的编程语言不同的是,bash 是一个 shell,也就是它以当前目录为上下文工作,你可以使用 ls 命令来查看当前目录的文件和目录
ls

# 这些命令的选项可以控制他们的运行
ls -l # 在单独的一行查看每一个文件

# 上一个命令的结果可以传递给下一个命令作为输入
# grep命令使用提供的模式过滤输入,因此我们可以用它来显示当前目录中的 .txt 文件
ls -l | grep "\.txt"

# 你也可以重定向一个命令的输入输出和错误
python2 hello.py < "input.in"
python2 hello.py > "output.out"
python2 hello.py 2> "error.err"
# The output error will overwrite the file if it exists, if you want to
# concatenate them, use ">>" instead.

# Commands can be substituted within other commands using $( ):
# 下面的命令显示当前目录下有多少文件和文件夹
echo "There are $(ls | wc -l) items here."

# 使用反引号 `` 也可以实现相同的效果,但是这样不能嵌套 - 最好是
# 使用 $( ).
echo "There are `ls | wc -l` items here."

# bash 的 case 语句类似于 Java and C++ 中的 switch 语句:
case "$VARIABLE" in 
    #List patterns for the conditions you want to meet
    0) echo "There is a zero.";;
    1) echo "There is a one.";;
    *) echo "It is not null.";;
esac

# for 循环执行的次数由参数给定:
# $VARIABLE 的值会被打印3遍.
for VARIABLE in {1..3}
do
    echo "$VARIABLE"
done

# 也可以在文件上执行..
# 使用 cat 操作 file1 和 file2
for VARIABLE in file1 file2
do
    cat "$VARIABLE"
done

# ..or the output from a command
# 把 ls 的输出传递给 cat
for OUTPUT in $(ls)
do
    cat "$OUTPUT"
done

# while 循环:
while [ true ]
do
    echo "loop body here..."
    break
done

# 可以定义函数
# 如下:
function foo ()
{
    echo "Arguments work just like script arguments: $@"
    echo "And: $1 $2..."
    echo "This is a function"
    return 0
}

# 或者
bar ()
{
    echo "Another way to declare functions!"
    return 0
}

# 调用你的函数
foo "My name is" $NAME

# 有很多有用的命令值得你学习:
# 打印 file.txt 的最后10行
tail -n 10 file.txt
# 打印 file.txt 的开头10行
head -n 10 file.txt
# 把 file.txt 的每行排序
sort file.txt
# report or omit repeated lines, with -d it reports them
uniq -d file.txt
# prints only the first column before the ',' character
cut -d ',' -f 1 file.txt

评论区