跳至主要內容

Shell

CoderAn大约 4 分钟Linux

Shell

基础知识open in new window

shell标识

#!/bin/bash#!告诉系统用后面指定路径中的程序来解释此脚本文件

运行方法

  1. 作为可执行程序
chmod +x ./test.sh
./test.sh
  1. 作为解释器参数
bash test.sh

变量

只读变量,不可修改

url='http://www.baidu.com'
readonly url

删除变量

unset variable_name

字符串

name="zong"
echo "name:${name}"
echo "len:${#name}"
echo "substr:${name:1:3}"

注释

:<<EOF
注释内容...
EOF

传递参数

#!/bin/bash
echo 'shell 传递参数实例:'
echo "执行文件名:$0"
echo "第一个参数:$1" 
echo "第一个参数:$2"  
echo "第一个参数:$3" 
echo "共$#个参数"
echo "所有参数:$*"
echo "所有参数:$@"
echo "脚本运行的当前进程ID:$$"
echo "后台运行的最后一个进程的ID号:$!"
echo "显示shell使用的当前选项:$-"
echo "最后命令的退出状态码:$?"

echo '$*和$@的区别:'
echo '$*:'
for i in "$*";
do
    echo ${i}
done

echo '$@:'
for i in "$@";
do 
    echo ${i}
done

数组

array=(val1 val2 val3 ...)

单独定义数组的各个分量:

array[2]=val2

读取数组

${array[1]}

获取数组长度

${#array[*]} 
or
${#array[@]}

基本运算符

exprawk

#!/bin/bash

# 算术运算符
val=`expr 2 + 2`
echo $val
a=10
b=20
echo "a:$a"
echo "b:$b"
val=`expr $a + $b`
echo "a + b = $val"
val=`expr $a - $b`
echo "a - b = $val"
val=`expr $a \* $b` # 乘法,*号前必须加斜杠
echo "a * b = $val"
val=`expr $b / $a`
echo "b / a = $val"
val=`expr $a % $b`
echo "a % b = $val"

if [ $a == $b ]
then
    echo 'a == b'
fi

if [ $a != $b ]
then
    echo 'a != b'
fi

# linux中的表达式: `expr 表达式`
# mac中的表达式:$((表达式))
echo $(($a + $b))

# 关系运算符
if [ $a -eq $b ]
then
    echo 'a==b'
fi

if [ $a -ne $b ]
then
    echo 'a!=b'
fi

if [ $a -gt $b ]
then
    echo 'a>b'
fi

if [ $a -lt $b ]
then
    echo 'a<b'
fi

if [ $a -ge $b ]
then
    echo 'a>=b'
fi

if [ $a -le $b ]
then
    echo 'a<=b'
fi

:<<EOF
 布尔运算符
 !  非运算 [ !false ]  true
 -o 或运算 [ $a -lt 20 -o $b -gt 100 ] true
 -a 与运算 [ $a -lt 20 -a $b -gt 100 ] false
EOF

:<<EOF
逻辑运算符
&&  [[ $a -lt 100 && $b -gt 100 ]]
||  [[ $a -lt 100 || $b -gt 100 ]]
EOF

# 字符串运算符
:<<EOF
a='abc'
b='efg'

'a=b:' [ $a = $b ]
'a!=b:' [ $a != $b ]
'检测字符串长度是否为0:' [ -z $a ]
'检测字符串长度是否不为0:' [ -n $a ]
'检测字符串是否为空:' [ $a ]

# 文件测试运算符
'块设备:' [ -b $file ]
'字符设备:' [ -c $file ]
'目录:' [-d $file]
'普通文件:' [ -f $file ]
'是否是有名管道:' [ -p $file ]
'读:' [ -r $file ]
'写:' [ -w $file ]
'执行:' [ -x $file ]
'文件是否为空:' [ -s $file ]
'检测文件(目录)是否存在:'  [ -e $file ]
EOF

printf命令

printf '语法:printf format-string [args...]\n'

format_str="%-10s %-8s %-4s\n"
format_num="%-10s %-8s %-4.2f\n"
printf "$format_str" 姓名 性别 体重Kg
printf "$format_num" 郭靖 男 66.1234
printf "$format_num" 黄蓉 女 32.1234
printf "$format_num" 杨过 男 65.1234
printf "$format_num" 小龙女 女 35.1234

流程控制

#!/bin/bash

#if else
a=10
if [ $a == 10 ]
then
    echo $a
else
    echo 'no $a'
fi

# for循环
for loop in 1 2 3 4 5
do
    echo $loop
done

# while循环
i=0
while((i<10)); do
    let "i++"
    echo ${i}
done

# 无限循环
:<<EOF
while true; do
    echo 'loop'
done

或者

for ((;;))
EOF

# util语句
j=0
until ((j>10)); do
    let "j++"
    echo ${j}
done

# case语句
echo '输入1到4之间的数字:'
echo '你输入的数字为:'
read num
case $num in 
    1) echo '你选择了1';;
    2) echo '你选择了2';;
    3) echo '你选择了3';;
    4) echo '你选择了4';;
esac

# 跳出循环
# break语句
while true; do
    echo -n '输入1-5之间的数字'
    read num
    case $num in
        1|2|3|4|5) echo "你输入了$num";;
        *) 
            echo '你输入的不是1-5之间的数字,程序退出'
            break
        ;;
    esac
done

#continue语句
while true; do
    echo -n '输入1-5之间的数字'
    read num
    case $num in
        1|2|3|4|5) echo "你输入了$num";;
        0)
            echo '程序结束'
            break
        ;;
        *) 
            echo '你输入的不是1-5之间的数字,程序退出'
            continue
        ;;
    esac
done

函数

#!/bin/bash

console(){
    echo 'console sth.'
    echo "参数:$1"
}

echo '输出函数:'
console
console zong

add(){
    echo '输入两个数进行加运算'
    echo '请输入第一个数:'
    read num1
    echo '请输入第二个数:'
    read num2
    return $(($num1+$num2))
}
add
echo "输入的两个数之和为:$?"

文件包含

. filename  # 注意点号(.)和文件名中间有一个空格
or 
source filename
上次编辑于:
贡献者: 宗安