shell入门

test_0

#! /bin/bash

echo 'hello world'

#这是单行注释
:<<EOF
    这是一个
    多行注释
    EOF可以用任意字符串替换
EOF


#定义变量
var1=cute
var2='vv123 is $var1' #注:单引号中的内容不会转译,相当于双引号前加-r
var3="vv123 is $var1"
#声明只读变量
readonly var2
declare -r var3
#声明全局变量
export var2
declare -x var3 #+x:全局变成自定义
#使用变量
echo ${var1}
#删除变量
unset var1


#获取字符串长度
echo ${#var3} #输出13
#取子串
echo ${var3:0:5} #输出vv123

#向脚本传递参数
echo "file name: "$0
echo "pid: "$$
echo "first parameter: "$1
echo "parameter number: "$#
echo "they are: "$*  #与&@类似
echo "last command's exit code: "$?

test_1

#! /bin/bash

#定义数组
array=(1 wxh "qwq" vv123) #以空格隔开
f[0]=0
f[2]=2
f[100]=233
echo ${f[0]}
echo ${f[*]} #输出0 2 233
echo ${#f[*]} #输出3




#expr的使用方法
#注1:$(command):返回command这条命令的stdout(可嵌套)
#注2:expr的exit code:
#如果不是逻辑表达式,exit code为0.
#如果是逻辑关系表达式,则结果为真,exit code为0,否则为1。

#字符串表达式
##length STRING
str="hello world"
echo $(expr length "$str") #输出11

##index STRING CHARSET:返回CHARSET中任意字符在STRING中最先出现的位置,下标从1开始,不存在返回0
echo $(expr index "$str" awd) #输出7

##substr STRING POSITION LENGTH
echo $(expr substr "$str" 2 3) #输出ell

#整数表达式
a=3
b=4
echo `expr $a + $b`  # 输出7
echo `expr $a - $b`  # 输出-1
echo `expr $a \* $b`  # 输出12,*需要转义
echo `expr $a / $b`  # 输出0,整除
echo `expr $a % $b` # 输出3
echo `expr \( $a + 1 \) \* \( $b + 1 \)`  # 输出20,小括号需要转义,各符号之间应有空格


#逻辑表达式 
#& | < <= = == != >= >
#=和==是一样的。如果不能把两边转换成整数,按字符串比较
#反斜杠转义==把符号用单引号括起来
a=3
b=4
echo `expr $a \> $b`  # 输出0
echo `expr $a '<' $b`  # 输出1
echo `expr $a '>=' $b`  # 输出0
echo `expr $a \<\= $b`  # 输出1
c=0
d=5
echo `expr $c \& $d`  # 输出0
echo `expr $a \& $b`  # 输出3
echo `expr $c \| $d`  # 输出5
echo `expr $a \| $b`  # 输出3
a='expr $a + 5' #相当于c语言中的a+=5

#字符串表达式的优先级高于数值表达式和逻辑关系表达式

test_2

#! /bin/bash

##read命令

read -p "What's your name? " -t 5 name





##echo命令

echo -e "hello, ${name}. \c" 
#用单引号会原样输出
#-e开启\n \c(\c取消换行)

#输出重定向
echo "hello world" > output.txt

#`(command)` 或 $(command)
echo "Time is `date`"



##printf命令

printf "%10dqwq\n" 123  # 占10位,右对齐
printf "%-10.2fqwq\n" 123.123321  # 占10位,四舍五入保留2位小数,左对齐
printf "My name is %s\n" "wxh"  # 格式化输出字符串
printf "%d * %d = %d\n"  2 3 `expr 2 \* 3` # 表达式的值作为参数

test_3

#! /bin/bash

##test 命令
#逻辑运算符&&和||
#借助短路原则,可以用来写if else

test -e test.sh && echo "exist" || echo "not exist"

#test和expr都会用exit code 0表示真,而expr还用stdout 1表示真
test 2 -lt 3
echo $? #输出0

:<<EOF
好家伙 我实在懒得打了 复制粘贴吧


1.文件类型判断

命令格式:test -e filename  # 判断文件是否存在

测试参数    代表意义
-e  文件是否存在
-f  是否为文件
-d  是否为目录




2.文件权限判断

命令格式:test -r filename  # 判断文件是否可读

测试参数    代表意义
-r  文件是否可读
-w  文件是否可写
-x  文件是否可执行
-s  是否为非空文件



3.整数间的比较

命令格式:test $a -eq $b  # a是否等于b

测试参数    代表意义
-eq a是否等于b
-ne a是否不等于b
-gt a是否大于b
-lt a是否小于b
-ge a是否大于等于b
-le a是否小于等于b



4.字符串比较

测试参数    代表义
test -z STRING  判断STRING是否为空,如果为空,则返回true
test -n STRING  判断STRING是否非空,如果非空,则返回true(-n可以省略)
test str1 == str2   判断str1是否等于str2
test str1 != str2   判断str1是否不等于str2




5.多重条件判定
命令格式:test -r filename -a -x filename
测试参数    代表意义
-a  两条件是否同时成立 (也就是python里的and)
-o  两条件是否至少一个成立 (也就是python里的or)
!   取反。如 test ! -x file,当file不可执行时,返回true








6.判断符号[]
[]与test用法几乎一模一样,更常用于if语句中。
另外[[]]是[]的加强版,支持的特性更多。

例如:

[ 2 -lt 3 ]  # 为真,返回值为0
echo $?  # 输出上个命令的返回值,输出0

ls  # 列出当前目录下的所有文件
输出:homework  output.txt  test.sh  tmp
[ -e test.sh ] && echo "exist" || echo "Not exist"
输出:exist  # test.sh 文件存
[ -e test2.sh ] && echo "exist" || echo "Not exist"
输出:Not exist  # testh2.sh 文件不存在


注意:
[]内的每一项都要用空格隔开
中括号内的变量,最好用双引号括起来
中括号内的常数,最好用单或双引号括起来

例如:
name="acwing yxc"
[ $name == "acwing yxc" ]  # 错误,等价于 [ acwing yxc == "acwing yxc" ],参数太多
[ "$name" == "acwing yxc" ]  # 正确

作者:yxc
链接:https://www.acwing.com/blog/content/9704/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
EOF

test_4

#! /bin/bash


#单个条件
a=3
b=4
if [ $a -lt $b ] && [ $a -gt 2 ]
then
    echo ${a}在范围内
fi

if expr 3 \= 2
then
    echo "3等于2"
else
    echo "3不等于2"
fi

#多重条件
a=4
if [ $a -eq 1 ]
then
    echo ${a}等于1
elif [ $a -eq 2 ]
then
    echo ${a}等于2
elif [ $a -eq 3 ]
then
    echo ${a}等于3
else
    echo 其他
fi

#switch case
a=4

case $a in
    1)
        echo ${a}等于1
        ;;  
    2)
        echo ${a}等于2
        ;;  
    3)                                                
        echo ${a}等于3
        ;;  
    *)
        echo 其他
        ;;  
esac

test_5

#遍历stdout
for i in `ls`
do
    echo $i
done
#seq函数
for i in `seq 1 10`
do
    echo $i
done
#{a..b}
for i in {a..z}
do
    echo $i
done
#c style
for ((i = 1; i <= 10; i++))
do
    echo $i
done
#while (EOF:ctrl+d或c(杀进程))
while read -p "input sth." name
do
    echo $name
    if [ "$name" == "exit" ]
    then
        break
    fi
done
#until...do...done
until [ "$word" == "stop" ] || [ "$word" == "STOP" ]
do
    read -p "please input stop/STOP to kill this program:
    " word
done
#break对case不起作用
while read name
do
    for i in {1..10}
    do
        case $i in
            5)
                continue;
                ;;
            8)
                break;
                ;;
            *)
                echo $i
                ;;
        esac
    done
done

test_6

#! /bin/bash
welcome() {
    read -p "tell me your name
    " name
    echo "hello $name"
}

output=`welcome`
echo "exit code is $?"
echo "stdout is $output"



##参数输入
func() {
    if [ $1 -le 0 ]
    then
        echo 0
        return 42
    fi

    sum=$(func $(expr $1 - 1))
    echo $(expr $sum + $1)
}

echo $(func 100)

test_7

#! /bin/bash
if [ $# -ne 1 ]
then
    echo "arguments not valid"
    exit 1
else
    echo "arguments valid"
    exit 0
fi

test_8

#! /bin/bash

echo -e "Hello \c" > output.txt
echo "World" >> output.txt

read str < output.txt
echo $str

test_9

#! /bin/bash

read a
read b

echo $(expr $a + $b)

#./test9.sh < input.txt > output.txt

test_10

#! /bin/bash
# name=vv123 in head.sh

source head.sh

echo $name
posted @ 2022-02-11 15:29  _vv123  阅读(97)  评论(0编辑  收藏  举报