쉘 프로그래밍 루프 문 및 함수
에코 문
1.1 일반적으로 사용되는 Echo 이스케이프 문자
Echo -n은 줄
바꿈 없는 출력을 의미 합니다. Echo -e는 이스케이프 문자를 출력하고 이스케이프 된 내용을 화면에 출력합니다.
일반적인 이스케이프 문자 | 의역 |
---|---|
\비 | 이스케이프 후 백 스페이스 키 (백 스페이스)를 누르는 것과 동일하지만 "\ b"뒤에 문자가 있다는 것을 전제로합니다. "\ b"는 이전 문자 삭제를 의미하고 "\ b \ b"는 처음 두 문자를 삭제하는 것을 의미합니다. |
\씨 | 줄 바꿈없이 출력합니다. "\ c"뒤에 문자가 없으면 echo -n과 동일하지만 "\ c"뒤에 여전히 문자가 있으면 "\ c"뒤에 문자가 출력되지 않습니다. |
\엔 | 줄 바꿈, 출력 할 문자는 "\ n"의 새 줄에서 시작합니다. |
\ v 또는 \ f | 줄 바꿈,하지만 줄 바꿈 후 새 줄의 시작 부분이 이전 줄의 끝에 연결됨 |
\티 | 탭 삽입, 즉 가로 탭을 의미합니다. |
\아르 자형 | 커서가 줄의 시작 부분으로 이동하지만 줄 바꿈되지 않습니다. 이는 "\ r"앞의 동일한 길이의 문자를 덮어 쓰기 위해 "\ r"뒤의 문자를 사용하는 것과 동일하지만 "\ r"뒤에 문자가 없으면 "\ r"앞의 문자를 덮어 씁니다. 문자를 덮어 쓰지 않습니다. |
\\ | "\"자체를 삽입하는 것을 의미합니다. |
작동 예
1.2 계산 방법
쉘 스크립트에는 4 가지 계산 방법이 있습니다.
1. i=$(expr 12 \* 5)
2. i=$((12*5))
3. i=$[12*5]
4. let i= 12*5
i++相当于i=$[$i+1]
i--相当于i=$[$i-1]
i+=2相当于i=$[$i+2]
두 개의 루프 문
2.1 for 루프
for 루프 문을 사용할 때 변수와 가능한 값 목록을 지정하고 변수 값이 다 떨어지고 루프를 완전히 종료 할 때까지 각 다른 값에 대해 동일한 명령 시퀀스를 반복적으로 실행해야합니다. 여기서 값 목록은 동일한 속성을 가진 여러 개체를 포함하는 for 문의 실행 조건으로, 미리 지정해야합니다.
2.1.1 for 루프 형식
for 变量名 in 取值列表
do
命令序列
done
예 : 사용자 추가 및 사용자 삭제
#!/bin/bash添加用户
ULIST=$(cat /root/user.txt)
for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &> /dev/null //把输出信息丢弃
done
#!/bin/bash删除用户
$ULIST=$(cat /root/user.txt)
for UNAME in $ULIST
do
userdel -r $UNAME
[$? -eq 0] && [echo "已删除用户$UNAME"]
done
2.1.2 루프 인터럽트 (중단, 계속)
기본적으로 break는 단일 루프에서 점프하고 break 2는 두 루프에서 점프하는 식으로 break n은 n 루프에서 점프합니다.
continue는 루프에서 명령을 종료하지만 전체 루프를 완전히 종료하지는 않습니다.
2.1.3 for 루프의 세 가지 방법
方法1
[root@localhost ~]#for i in {1..10};do echo $i;done //按序输出1到10
[root@localhost ~]#for i in {1..10..2};do echo $i;done //输出1到10,步长为2
方法2
[root@localhost ~]#for i in $(seq 1 10);do echo $i;done //按序输出1到10
[root@localhost ~]#for i in $(seq 1 2 10);do echo $i;done //输出1到10,步长为2
方法3
[root@localhost ~]#for ((i=1;i<=10;i++));do echo $i;done
2.2 while 루프
while 条件测试操作
do
命令序列
done
예 : 상품 가격 추측
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "good's price between 0-999,how much?"
while true
do
read -p "please input the price you guessed:" INT
let TIMES++
if [ $INT -eq $PRICE ];then
echo "You're right.The price is $PRICE"
echo "You have guessed $TIMES times."
exit 0
elif [ $INT -gt $PRICE ];then
echo "Too high!"
else echo "Too low!"
fi
done
2.3 until 루프
특정 조건을 반복 테스트하고 조건이 성립되지 않는 한 반복 실행
until 条件测试操作
do
命令序列
done
예 : 1에서 누적
#!/bin/bash
read -p "从1加到几?" num
i=0;s=0
until [ $i -eq $num ]
do
let "i++";let "s=$s+$i"
done
echo "sum(1...$num)="$s
세 가지 기능
기능 정의
[function] 函数名 ()
{
命令序列
[return x]
}
통화 기능
函数名 [参数1] [参数2]
3.1 함수 반환 값
반환은 함수를 종료하고 종료 값을 반환하는 것을 의미합니다. 스크립트는 ? 변수를 사용 하여 값을 표시 할 수 있습니다 . 사용 원리 : 1 변수가 값을 표시하기 때문에 반환 값을 가져옵니다. 원리 : 1 함수가 종료되면 반환 값을 가져옵니다. ,때문에? 변수 양을 크게 표시 값 차종이 사용하는 원래의가 있다 : 기능 의 수 접합 빔 을 받아 반환 에 다시 값 , 때문에 같은 ? 마지막 명령 실행 종료 상태 변수를 반환
넘어이 종료 상태 코드가 255이어야합니다 256으로 나눌 때 나머지를 취하십시오
db()
{
read -p "input:" value
return $[$value * 2]
}
db
echo $?
3.2 재귀 함수
재귀 함수는 자신을 호출하며, 함수를 분석 할 때 함수 호출을 건너 뛰고 부분을 분석 할 수 있습니다.
예 : 환경 변수의 디렉토리 및 실행 파일을 재귀 적으로 트래버스
#!/bin/bash
//递归函数部分
file_list() {
for f in $1/* // $1/*表示取值列表,读取PATH下目录
do
if [ -d $f ];then //对$f进行判断,-d表示是否为目录
echo "$2$f"
file_list "$f" " $2" //调用函数自身,把$f下的所有目录和文件作为取值列表,再次进行判断
elif [ -x $f ];then //对$f进行判断,-x表示是否为可执行文件
echo "$2$f" //输出空格接该文件
fi
done
}
//主程序部分
IFS=$IFS':' //IFS字段分隔符,默认包含空格,换行,制表符,加入':'对冒号也可以识别并进行分隔
for folder in $PATH
do
echo "$folder:"
file_list "$folder" " " //调用函数,加入位参1,2
done
3.3 함수 라이브러리 생성 및 호출
예 : 더하기, 빼기, 곱하기 및 나누기 함수 라이브러리
创建函数库
[root@localhost ~]#vim myfuncs.sh
jiafa()
{
echo $[$1+$2]
}
jianfa()
{
echo $[$1-$2]
}
chengfa()
{
echo $[$1*$2]
}
chufa()
{
if [ $2 -ne 0 ];then
echo $[$1/$2]
else
echo '$2不能为0'
fi
}
//调用函数库
. myfuncs.sh
value1=10
value2=5
result1=`jiafa $value1 $value2`
result2=`jianfa $value1 $value2`
result3=`chengfa $value1 $value2`
result4=`chufa $value1 $value2`
echo "加法结果为$result1"
echo "减法结果为$result2"
echo "乘法结果为$result3"
echo "除法结果为$result4"
4 개의 for 루프 출력 99 곱셈 테이블, 다이아몬드
4.1 곱셈표
#!/bin/bash
for ((i=1;i<=9;i++)) //外循环控制行数
do
for ((j=1;j<=i;j++)) //内循环控制列数
do
echo -n -e "$i x $j = $((i * j))\t"
done
echo -e "\n"
done
4.2 다이아몬드
#!/bin/bash
#菱形上半部分
for ((i=9;i>=1;i--)) #控制行数
do
for ((a=1;a<=$i;a++)) #控制第i行第一段输出
do
echo -n " "
done
for ((b=9;b>=$i;b--)) #控制第i行第二段输出
do
echo -n "*"
done
for ((c=8;c>=$i;c--)) #控制第i行第三段输出
do
echo -n "*"
done
echo ""
done
#菱形下半部分
for ((h=2;h<=9;h++))
do
for ((d=1;d<=$h;d++))
do
echo -n " "
done
for ((e=9;e>=$h;e--))
do
echo -n "*"
done
for ((f=8;f>=$h;f--))
do
echo -n "*"
done
echo ""
done