知识点
y总讲义
易混淆:
1.$()是返回这条命令的stdout; ${}是取变量的值
语法例子1
#! /bin/bash
# 这是一个单行注释
echo "Hello World! " #这也是一个注释
:<<EOF
这是一个多行注释!!!、!
!!!!
EOF
name=CodeWater
echo ${name}yyds
echo ${#name} #取字符串的长度
echo ${name:0:4} #取从0开始的4个字符
echo "文件名"$0
echo "第一个参数(后面依次类推):"$1
echo "第二个参数:"$2
echo "参数的总个数:" $#
echo "当前进程的id是:"$$
# $*和$@(大部分情况一样):就是把所有的参数作为字符串输出,详情看讲义
echo "这是\$*:"$*
echo "这是\$@:"$@
echo "上一条命令的返回状态:"$?
echo "获取ls这条命令的标准输出(其他命令同理):"$(ls) # `ls` 同义写法
echo "---------------------------数组--------------------------------"
array=(1 abc code "water" ) #空格分隔元素,第二种指定下标赋值可以跳着来
#获取数组元素
echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
echo ${array[3]}
#读取数组所有元素
echo ${array[@]}
echo ${array[*]}
#求数组的长度
echo ${#array[*]}
echo "-------------------------expr命令-------------------------"
#------字符表达式
#求字符串长度
str="Hello World!!!!!!!!!!"
echo $(expr length "$str")
#查询指定字符串(这里是awd)的中字符时候出现过
echo `expr index "$str" awd `
#获取子串,下标是从1开始的
echo $(expr substr "$str" 2 3)
#-----整数表达式
a=3
b=4
echo `expr $a + $b ` #a+b=7
echo `expr $a - $b ` #a-b=-1
echo `expr $a \* $b ` #a*b=12
echo `expr $a / $b ` #a/b=0,整除
echo `expr $a % $b ` #取模,3
echo `expr \( $a + 1 \) \* \( $b + 1 \) ` #(a+1)*(b+1)=20
#-----逻辑表达式, 0-false 1-true
echo `expr $a \> $b `
echo `expr $a '<' $b ` #‘’ 也是转义,和\一样作用
echo `expr $a '>=' $b `
echo $( expr $a \<\= $b )
c=0
d=5
echo `expr $c \& $d `
echo `expr $a \& $b `
echo `expr $c \| $d `
echo `expr $a \| $b `
echo '----------------------------read命令---------------------'
#read name
#echo Hello , $name
#read -p "What's your name ?" name
#echo Hello,$name
#read -p "What's your name ?" -t 5 name
#echo Hello , $name
echo "---------------------------------echo命令------------------"
echo -e "Hello \c"
echo "World"
echo -e "原样输出 \c"
echo ' $name\" '
echo "---------------------------------print-----------------------"
printf "%10d!\n" 111
printf "%-10.2f!\n" 111.21343
printf "My name is %s \n" "CodeWater"
printf "%d * %d = %d\n" 4 5 `expr 4 \* 5`
echo "--------------------------判断语句---------------------------"
if [ 3 -lt 5 ] #等价于if expr 3 '<' 5
then
echo "true"
fi
c=7
if [ $c == 1 ]
then
echo ${c}等于1
elif [ $c == 2 ]
then
echo ${c}等于2
else
echo ${c}等于其他
fi
d=5
case $d in
1)
echo ${d}等于1
;;
2)
echo ${d}等于2
;;
3)
echo ${d}等于3
;;
*)
echo 其他
;; #可删,但不建议
esac
语法例子2
#! /bin/bash
echo "-------------------------循环---------------------------------"
for i in a 2 cc code water
do
echo $i
done
for i in `ls` # 可换$(ls) , $()是执行命令 ${}是取变量的值
do
echo $i
done
for i in {a..d} #括号和内容之间不要有空格,不然无效
do
echo $i
done
for((i = 1 ; i < 10 ; i++))
do
echo $i
done
#while read name
#do
# echo $name
#done
#until [ "${word}" == "yes" ] || [ "${word}" == "YES" ]
#do
# read -p "Please input yes/YES to stop this program... : " word
#done
#while read name
#do
# for(( i = 0 ; i <= 10 ; i++))
# do
# case $i in
# 7)
# break;
# ;;
# *)
# echo $i
# ;;
# esac
# done
#done
#输出1-10之间的奇数
:<<!
for (( i = 1 ; i <= 10 ; i++))
do
if [ `expr $i % 2` -eq 0 ]
then
continue
fi
echo $i
done
!
echo "----------------------函数------------------------"
func(){
name=codewater
echo "hello $name"
}
func1(){
name=codewater
echo "Hello $name"
return 111
}
output=$(func1)
return=$?
echo "output = $output"
echo "return = $return"
func2(){
if [ $1 -le 0 ]
then
echo 0
return 0
fi
sum=$(func2 $(expr $1 - 1))
echo $(expr $sum + $1 )
}
echo $(func2 100)
:<<!
echo "---------------------exit-----------------------"
if [ $# -ne 1 ]
then
echo "arguments not valid"
exit 1
else
echo "arguments valid"
exit 0
fi
!
echo "--------------------文件重定向-------------------"
echo -e "Hello \c" > output.txt
echo "World" >> output.txt
read str < output.txt
echo $str
作业
0.
https://www.acwing.com/activity/content/code/content/2307875/
1.不需要写成elif,都是并列的,不然就会错
https://www.acwing.com/activity/content/code/content/2307884/
2.
#! /bin/bash
read n
a[0]=1
a[1]=1
for(( i = 2 ; i <= n ;i++))
do
x=$(expr $i - 1)
y=$(expr $i - 2)
a[i]=$(expr ${a[$x]} + ${a[$y]})
done
echo ${a[$n]}
#我的错误,不知道怎么写递归和标准输出(实际就是echo。。。)
:<<!
func(){
if [ ${n} -eq 1 ]
echo 1
elif
echo `expr n * func` # 。。。
}
!
3.
https://www.acwing.com/activity/content/code/content/2307901/
4.
#! /bin/bash
input_file=$1
output_file=$2
read n < $input_file
sum=0
for((i = 1 ; i <= n ; i++))
do
sqr=`expr $i \* $i`
sum=`expr $sum + $sqr`
done
echo $sum > $output_file
$
是这个符号,在那个markdown里面打出来后,预览显示空白,我也不知道咋调,难受....
加个转义符号试一试 \
谢谢,不过他连那个转义符也显示了,我直接弄到代码框里面算了
hh 写的不错