경로: 슬래시로 구분된 일련의 파일 이름을 경로라고 합니다. 경로는 파일의 위치를 나타내는 데 사용됩니다. 슬래시는 절대 경로라고 합니다. 그렇지 않으면 현재 작업 디렉터리에 상대적인 상대 경로입니다
스크립트를 종료하는 공식적인 방법은 다음과 같이 명시적으로 종료 [코드] 명령을 사용하는 것입니다. C 언어의 scanf와 유사하게 매개변수 할당을 완료하는 buildin 명령입니다.
변수뿐만 아니라 배열도 할당할 수 있습니다.
2. 실습
# 읽기 이름 성별 연령 -- 3개의 변수에 값을 할당합니다. 동시에 입력 구분 기호는 공백 문자
3. 연산 도구
1. 간단한 수학 연산
#에 할당합니다. ((a=1+2**2-3*4/5%6) ) --위와 동일# echo "scale=3;10/3" | bc --bc 계산기; 소수점 세 자리까지 유지
2. 난수 가져오기
# od -tu8 /dev/urandom | sed -r 's/^[0-9]+s+//' | sed -r 's/s+/n/g' |cut -b1-8 |sed -r -n '/^.{8}$/p' | sed 's/^/186/' |head -n5000 |vi - --10,000개의 전화번호 가져오기
# od -N40000 -tu4 /dev/urandom | -r 's/^[0-9]+(s+)?//' | sed -r 's/s+/n/g' | grep -vE '^s*$' > 임의의 숫자
4. if/then example
2. /root/test/test.sh가 존재하고 실행 권한이 있는지 확인하세요
4. 파일 유형을 결정합니다.
file=$1
flag=$(ls -ld $file | cut -b1)
test "$flag" = "1"
return $?
}
file=$1
if isSymbolicLink $ file; then
echo "기호 링크"
elif test -d $file; then
echo "디렉터리 파일"
elif test -f $file then
echo "일반 파일"
elif test - b $file; then
echo "특수 차단"
elif test -c $file; then
echo "특수 문자"
elif test -p $file then
echo "명명된 파이프"
elif test -S $file; then
echo "Socket"
else
Echo "Unkown"
fi
5. 입력 숫자의 크기를 결정합니다
# vim test.sh
#!/bin /bash
num=$1
if test "$num" -lt 10 ;then
echo "작은 숫자"
elif test "$num" -lt 20;then
echo "중간 숫자"
elif test " $num" -lt 30;then
echo "큰 숫자"
else
echo "매우 큰 숫자"
fi
6에서 숫자를 가져와서 지정된 문자열을 출력합니다. 크기
# vim test.sh
#!/bin/bash
echo -n "숫자 입력: "
숫자 읽기
if [ "$num" -lt 100 ]; then
echo "100보다 작음"
elif [ "$num" -ge 100 -a "$num" -lt 200 ]; then
echo "보다 큼 또는 같음 200보다 작음"
elif [ "$num" -ge 200 -a "$num" -lt 300 ]; then
echo "200보다 크거나 같고 300보다 작음"
else
echo "다른 숫자"
fi
5. wihle 루프
1. 이해
while 키워드 뒤의 명령 반환 코드를 테스트합니다. while 루프 본문의 명령은 0입니다. 루프 본문은 다음과 같습니다.
while [] --while 및 [ ] 명령을 실행하고 [ ] 명령의 반환 코드를 테스트합니다.
cat /filename | while read line --while 및 then 읽기 명령을 실행하고 읽기 명령의 반환 코드를 테스트합니다. 반환 코드
do
......
done
2. 루프 제어 문
continue - 현재 루프를 종료하고 다음 루프를 시작합니다. one
break -- 현재 루프를 종료하고 루프 본문을 종료합니다.
exit -- 현재 스크립트를 종료합니다.
3. 예
# vim test.sh -- 계속과 중단의 차이점 구분
#!/bin/bash
true
do
sleep 1
echo test
continue/break
echo
done
# vim test.sh --break와 break의 차이점을 구별하세요 종료
#!/bin/bash
테스트하는 동안 - e /data/test/test.sh
do
echo "exists"
sleep 1
break/exit
done
echo "loop end"
# vim test.sh --찾을 때까지 우리가 제공한 경로를 찾아보세요
# !/bin/bash
if test $# -ne 1;then
echo "잘못된 매개변수" >&2
exit
fi
path=$1
while test ! -e "$path"
do
sleep 1
echo "don'tfound!!!"
done
echo "found"
# vim test.sh --스크립트는 지정된 시간 동안 실행되고 해당 시간이 되면 종료됩니다. ; s
#!/bin/bash
if test $# -ne 1;then
echo "Usage: $(basename $0) TIME" >&2
exit 1
fi
timeLength에 대한 단위 =$1
beginTime=$(날짜 +%s)
endTime=$(( $beginTime + $timeLength ))
---------------------- -- ----------------------------------
테스트하는 동안 $(날짜 +%s) -lt " $endTime "
do
echo "처리 중...."
sleep 1
done
------------------------- - ----------------------------------
true일 때
do
if test $(date + %s) - ge "$endTime";then
break
fi
echo "처리 중...."
sleep 1
done
-------------------------------------- --------
echo "time out"
# vim test.sh --파일의 각 줄을 반복하면서 각 줄의 문자 수를 계산합니다
#!/bin/bash
file=$1
-------------------------------------------- ------ ---------------
totalLines=$(wc -l < $file)
line=1
while test $line -le $totalLines
do
lineData= $(sed -n "${line}p" $file)
len=$(echo -n $lineData | wc -c)
echo "라인 ${line}: $len "
line=$( ( $line + 1 ))
done
------------------------------- ---------- -----
line=1
읽는 동안 lineData
do
len=$(echo $lineData | wc -c)
echo "${line}: $len"
line=$(( $line + 1 ))
done < $file
------ --------- --------------- -
# vim test.sh -- 10줄의 hello world를 인쇄합니다. <(seq 10)은 프로세스 교체
#!/bin/bash
읽는 동안 파일 경로와 동일합니다
do
echo "hello world"
done <(seq 10)
------------- -------- ----------
n=1
동안 [ $n -le 10 ]
do
echo "hello world"
n=$((n+1))
done
------------------------- -------- ----------
# vim test.sh --무한 루프를 생성하여 1분 동안 실행한 후 루프가 자동으로 종료되도록 요구합니다
#!/bin/bash
start_time=$(date +%s)
true 동안
do
cur_time=$(date +%s)
test $((cur_time - start_time)) -ge 10 && break
time=$((cur_time - start_time))
echo "시간은 $time입니다. . ...."
sleep 1
done
# vim test.sh --먼저 while 루프를 사용하여 100개의 .txt 파일을 만든 다음 모든 파일의 접미사를 .html
#으로 변경하세요! /bin /bash
count=100
----------------------------------------- -- ---
seq $count | 읽는 동안 i
do
touch ${i}.txt
done
ls -1 *.txt | 읽는 동안 oldname
do
newname=$(echo $oldname | sed 's/.txt$/.html/')
mv $oldname $newname
done
--- -- ------------------------------------------------ -- -
읽는 동안 i
do
touch ${i}.txt
done < <( seq $count )
읽는 동안 oldname
do
newname=$(echo $ oldname | sed 's/.txt$/.html/')
mv $oldname $newname
done <(ls -1 *.txt )
# vim test.sh -계산 1000 파이프가 하위 프로세스를 생성하므로 파이프 내의 짝수 합계를 사용할 수 없습니다
#!/bin/bash
sum=0
읽는 동안 num
do
sum=$(( $sum + $num ))
done < <(seq 2 2 998)
echo "sum: $sum "
# vim test.sh --100개의 이메일을 일괄 추가 사용자, 사용자 이름은 u1 ~ u100, 비밀번호는 abc, 로그인 쉘은 /sbin/nologin, 이메일 그룹
#!/bin/bash
password=abc
group=email
grep -Eq에만 속합니다. " ^${group}:" /etc/group || groupadd $group
읽는 동안 i
do
useradd u${i} -N -g $group -s /sbin/nologin
passwd u$ { i} --stdin <<< "$password"
done <(seq 100)
# vim test.sh --방금 생성한 100명의 이메일 사용자를 일괄 삭제합니다
# ! /bin/bash
읽는 동안 i
do
userdel -r u${i}
done < 열린 문자열에서 한 번에 하나씩 순서대로 가져오면 루프가 종료됩니다.
매번 빼낸 문자열은 변수에 저장되어 루프 본문에서 사용할 수 있습니다.
구분자로 구분된 문자열은 다음 방법을 통해 제공할 수 있습니다.
1 루프용 문자열을 수동으로 입력합니다. 지정된 횟수
# vim test.sh
#!/bin/bash
for i in 1 2 3
do
echo $i
don
2. 변수
# vim test.sh
#!/bin/bash
FILES="/bin/bash /bin /ls /bin/cat"
for file in $FILES
do
echo $file
done
3. 프로그램 생성 문자열
# vim test.sh
#!/bin/bash
for n in $(seq 11)
do
echo $n
done
4 셸 확장으로 생성됨, 디렉터리의 파일 반복
# vim test.sh
#!/bin/bash
for f in /etc/init.d/*
do
echo $f
done
# vim test.sh
5 /dev
# vim test.sh
#!/bin/ bash
에서 루프로 시작하는 모든 파일의 파일 이름을 인쇄합니다.
for file in /dev/loop*
do
echo $(basename $file)
done
6 1000
# vim test.sh
#!/ bin/bash
sum=0
for number in $(seq 2 2 998)
do
sum=$(( $sum + $number ))
done
echo "총계: $ sum"
7. 100명의 이메일 사용자를 일괄 추가합니다. 사용자 이름은 u1~u10이고, 비밀번호는 abc이며, 로그인 셸은 /sbin/nologin이며, 이메일 그룹에만 속합니다
# vim test.sh
#!/ bin/bash
function checkGid() {
gid=$1
if ! grep -qE "^$gid:" /etc/group; then
groupadd $gid
fi
}
함수 isRoot( ) {
id=$(id | awk -F "[=(]" '{print $2}')
if test "$id" -ne 0; then
echo "루트여야 함" >&2
exit 1
fi
}
count=10
namePrefix=u
password=abc
shell=/sbin/nologin
gid=email
isRoot
checkGid $gid
for $(의 숫자 seq $count)
do
name=${namePrefix}${num}
useradd $name -s $shell -g $gid &> /dev/null
if test $?
echo "$name을 생성하지 못했습니다." >&2
else
echo "성공적으로 생성되었습니다 -- $name"
echo "$password" | passwd --stdin $name &> /dev/null
if test $? -ne 0; then
echo "$name의 비밀번호를 변경하지 못했습니다." >&2
else
echo "비밀번호가 성공적으로 변경되었습니다. -- $name"
fi
fi
8 , LAN에 있는 모든 컴퓨터의 IP 및 MAC 주소에 해당하는 테이블을 가져옵니다
# vim test.sh
#!/bin/bash
ipPrefix=192.168.1.
startIp=1
endIp=254
for num in $(seq $startIp $endIp)
do
ip=${ipPrefix}$num
ping -W1 -c1 $ip &>/dev/null &
done
wait
arp -n | sed '/incomplete/d' | awk '{print $1,$3}' | 정렬 -n -k4,4 |
9 곱셈표를 인쇄하세요
# vim test.sh
#!/bin/bash
for row in $(seq 9)
do
for col in $(seq $row)
do
echo -n "${col}x${row}=$(( $col * $row )) "
done
echo
done | 열 -t
10.
#!/bin/bash
varnum=3
if test "$#" -ne "$varnum" then
echo "잘못된 인수" >&2
exit 1
fi
num1 =$1
num2=$3
operator=$2
if test "$operator" = "x";then
operator="*"
fi
if test "$operator" = "/" - a "$num2" = 0; then
echo "0으로 나누기" >& 2
exit 1
fi
result=$(( $num1 $operator $num2 ))
echo "$result"
참고: 곱셈 처리, 배당금이 0
11일 때 처리. 지정된 디렉터리에 특정 파일을 복사합니다. 요구 사항:
#1. 명령줄에서 두 개의 매개 변수를 받습니다. 원본 디렉터리와 대상 디렉터리가 각각
#2. 원본 디렉터리가 없으면 오류가 보고됩니다
#3. 대상 디렉터리가 없으면 새로 만듭니다
#4. 디렉토리는 아니고 에러 리포트
#5. 일반 파일과 소프트 링크 파일만 복사하세요
#6. 일반 파일은 1M 이하의 파일만 복사하세요
# vim /test.sh
# !/bin/bash
function displayHelp()
{
echo "사용법: $(basename $0) SRCDIR DSTDIR"
}
function getSize()
{
file=$1
size=$(ls -l $file | awk '{print $5}')
echo $size
}
if test $# -ne 2; then
displayHelp >&2
exit 1
fi
srcdir=$1
dstdir=$2
if 테스트! -d "$srcdir"; then
echo "$srcdir이 존재하지 않거나 디렉토리가 아닙니다." >&2
exit 1
fi
if test ! -e "$dstdir"; 그럼
mkdir "$dstdir"
fi
if 테스트 ! -d "$dstdir"; then
echo "$dstdir은 디렉토리가 아닙니다." >&2
exit 1
fi
for file in $srcdir/*
do
if test -L $file; then
cp -a $file $dstdir/
elif test -f $file; 그럼
---------------------------------- ----
size=$(getSize $file)
if test "$size" -lt 1048576; 그럼
cp -a $file $dstdir/
fi
----------------------------------- -----------------
find $file -type f -size -1024k -exec cp -a {} $dstdir/ ;
--------- ------------------------------
fi
완료