编辑代码

#JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。

#shell基础知识

#变量
a=1
b=2
c=3
echo $a
#删除变量
unset c
str1="hello"
#求长用#
echo "字符串长度:${#str1}"
echo '单引号内不能有变量:${#str1}'
#执行shell脚本时可以向其传递参数,$n表示第n个参数
echo "执行文件名:$0"
echo "第一个参数为:$1"
#执行时:$ ./test.sh 1 2 3

#数组
#仅支持一维数组,无需设置大小
array1=(1 2 3)
array1[3]=4
echo ${array1[2]}
echo "数组长度:${#array1[@]}"
#获取所有元素
echo "所有元素(1个字符串):${array1[*]}"
echo "所有元素(n个):${array1[@]}"
#关联数组(键唯一)
declare -A array2=(["aa"]="11" ["bb"]="22")
echo ${array2["aa"]}
echo "数组的键:${!array2[@]}"

#运算符
#算数运算用反引号和expr实现,需用空格
val1=`expr $a + $b`
echo "ab之和:$val1"
#关系运算符 返回true/false
#判等-eq,不等-ne,左大-gt,左小-lt,大等于-ge,小等于-le
#布尔运算符:!非,-o 或,-a 与,优先级为非与或
#逻辑运算符 && 与,||或
#字符串运算符,返回true/false
#判等 =,不等!=,长度为0-z,不为0-n,非空$($无空格)
#文件测试运算符 t/f,判断文件类型属性等

#echo显示命令
#从输入中读取一行
read name
#开启转义字符-e
echo "遇\n换行"
echo -e "hello,\n"
echo -e "\"world\""
echo "遇\c不换行"
echo -e "hello,\c"
echo -e "\"world\""
#显示结果定向到文件
echo "It is a test" > myfile

#prinft输出命令
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.18
#%s %c %d %f 都是格式替代符
#%-10s 指一个宽度为 10 个字符(-表示左对齐,无则右对齐)

#test测试命令
#数值测试
a=3
b=4
if test a gt b
then
    echo "左数更大"
else
    echo "右数更大"
fi
#[]可执行基本的算数运算
res1=$[a+b]
echo "ab之和:$res1"
#字符串测试
#等=,不等!=,长度为0 -z 字符串,不为0 -n 字符串
#文件测试,用于判断存在,权限和类型

#流程控制(操作不能为空)
#if判断(常与test一起使用)
if [$a -eq $b]
then
    echo "ab相等"
#使用 ((...))则内部可用<>符号
elif (($a > $b))  
then 
    echo "a大于b"
else
    echo "a小于b"
fi
#for循环
#item可以是数,字符串,文件名
for var1 in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
#while循环
#用于不断执行一系列命令
int=1
while(( $int<=5 ))
do
    echo $int
    #let命令使变量运算不用加$
    let "int++" 
done
#还可用于从输入文件(或键盘)中读取数据
while read FILM
do
    echo "$FILM 是一个好网站"
done
#无限循环1
while : #或 while true
do
    command
done
#无限循环2
for (( ; ; ))
#until 循环 
#条件为false则执行命令,直至条件为 true 时停止
until condition
do
    command
done
#case ... esac多选择语句
#)开始分支,;;结束分支
casein
值1)  
    command1
    ;;
值2)
    command2
    commandn
    ;;
esac
#break跳出所有循环,continue跳出单层循环

#Shell 函数
#函数定义
[ function ] funname [()]
{
    action;
    [return int;]
}
#可以带function fun() 定义,也可以fun() 定义,不带任何参数。
#return后跟数值n(0-255)
#若无return,将以最后一条命令运行结果,作为返回值。
funWithReturn(){
    echo "该函数将输入的两个数字相加"
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum 。"
    return $(($aNum+$anotherNum))
}
#函数调用
funWithReturn
#函数返回值在调用该函数后通过 $? 来获得,
echo "输入的两个数字之和为 $? !"
#调用后需立刻获取,再次获得需要再次调用
echo "第二次获取会失效 $?  "
#函数参数
funWithParam(){
    #在函数体内部,通过 $n 的形式来获取参数的值
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    #当n>=10时,需要使用${n}来获取参数。
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
#调用函数时可以向其传递参数
funWithParam 1 2 3 4 5 6 7 8 9 34 73

#输入/输出重定向
#输出重定向会覆盖文件内容
#执行command1然后将输出的内容存入file1
command1 > file1
#若不覆盖,则使用>>追加到文件末尾
echo "hello" >> file1
#cat命令可查看文件内容
cat users
#输入重定向
command1 < file1
#从文件infile读取内容,再将输出写入到outfile中
command1 < infile > outfile
#文件描述符 0 是标准输入(STDIN),默认从stdin读取数据
#1 是标准输出(STDOUT),默认输出数据到stdout
#2 是标准错误输出(STDERR),会向其中写入错误信息
#Here Document
#用于将输入重定向到一个交互式 Shell 脚本或程序
#将两个 delimiter 之间的内容(document) 作为输入传递给 command
command << delimiter
    document
delimiter
#/dev/null 文件
#若不在屏幕显示输出,则需输出重定向到 /dev/null
command > /dev/null
#屏蔽 stdout 和 stderr
command > /dev/null 2>&1

#Shell文件包含
#可包含外部脚本,可采取以下两种形式
. filename   # 注意点号(.)和文件名中间有空格
source filename
#执行时,被包含的文件不需要可执行权限。