셸 스 크 립 트 의 입문
46945 단어 linux
지원 하 는 셸 형식 을 볼 수 있 습 니 다
cat /etc/shells
.우리 가 가장 자주 사용 하 는 것 은 바로 bash 이다.호 환 sh#!/bin/bash
셸 변수
주의 점:
변 수 를 할당 할 때 중간 에 있 는 것 은 번호 앞 뒤 에 빈 칸 이 있어 서 는 안 됩 니 다.
name=11
echo $name
1name //
_name //
name = "hello" //
name="test"
echo $name
echo ${name}
a=z # Assign the string "z" to variable a.
b="a string" # Embedded spaces must be within quotes.
c="a string and $b" # Other expansions such as variables can be
# expanded into the assignment.
d="$(ls -l foo.txt)" # Results of a command.
e=$((5 * 7)) # Arithmetic expansion.
f="\t\ta string
" # Escape sequences such as tabs and newlines.
변수 앞 에 readonly 를 추가 하면 이 변 수 는 읽 기만 합 니 다.상수 와 유사 하 다.
readonly PI=3.14
echo $PI
name="test"
unset $name
변수의 종류.부분 변수, 환경 변수, 셸 변수 가 있 습 니 다.
문자열
문자열 은 php 와 유사 합 니 다.작은 따옴표 와 작은 따옴표 로 묶 을 수 있 지만, 작은 따옴표 로 묶 은 문자열 은 그 안의 변 수 를 해석 할 수 있 습 니 다.
작은 따옴표 안에 작은 따옴표 가 나타 나 면 안 됩 니 다.
str="hello''"
str2='hello'
str3='"test"'//
str4="str2$str2"
echo $str4
name1="hello"
name2="world"
echo $name1 $name2// hello world
str="helloworld"
${#str}
str="helloworld"
echo ${str:0:4} // 0 4 hell
${var} var , $var
${var-DEFAULT} var , $DEFAULT *
${var:-DEFAULT} var , , $DEFAULT *
${var=DEFAULT} var , $DEFAULT *
${var:=DEFAULT} var , , $DEFAULT *
${var+OTHER} var , $OTHER, null
${var:+OTHER} var , $OTHER, null
${var?ERR_MSG} var , $ERR_MSG *
${var:?ERR_MSG} var , $ERR_MSG *
${!varprefix*} varprefix
${!varprefix@} varprefix
${#string} $string
${string:position} $string , $position
${string:position:length} $string , $position $length
${string#substring} $string , $substring
${string##substring} $string , $substring
${string%substring} $string , $substring
${string%%substring} $string , $substring
${string/substring/replacement} $replacement, $substring
${string//substring/replacement} $replacement, $substring
${string/#substring/replacement} $string $substring, $replacement $substring
${string/%substring/replacement} $string $substring, $replacement $substring
str="hello"
echo ${#str}//5
echo ${str:0:2} //he
echo ${str/l/test}//heltesto
echo ${str//l/test} //hetesttesto
command << token
text
token
# shell example
cat << _EOF_
<span class="token variable">$TITLE</span>
_EOF_
# terminal example
$ cat << _EOF_
\> $foo
\> "$foo"
\> '$foo'
\> \$foo
\> _EOF_
대괄호 역할
$a
${a}
a="foo"
echo "${a}_file" #
빈 문자 와 존재 하지 않 는 문자 처리
parameter word, 。
${parameter:-word}
, : 。
${parameter:=word}
unset empty word error
${parameter:?word}
${parameter:+word}
String operation (문자열 연산 자)
${#parameter} #
$ foo="This string is long."
$ echo "'$foo' is ${#foo} characters long.
'This string is long.' is 20 characters long
${parameter:offset}
${parameter:offset:length}
[me@linuxbox ~]$ foo="This string is long."
[me@linuxbox ~]$ echo ${foo:5}
string is long.
[me@linuxbox ~]$ echo ${foo:5:6}
string
${parameter#pattern}
${parameter##pattern}
[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ echo ${foo#*.}
txt.zip
[me@linuxbox ~]$ echo ${foo##*.}
zip
${parameter%pattern}
${parameter%%pattern}
[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ echo ${foo%.*}
file.txt
[me@linuxbox ~]$ echo ${foo%%.*}
file
${parameter/pattern/string}
${parameter//pattern/string}
${parameter/#pattern/string}
${parameter/%pattern/string}
expansion 으로 script 의 효율 을 높 일 수 있 습 니 다.
대소 문자 변환
무엇 에 쓸 수 있 습 니까?예 를 들 어 데이터 베 이 스 를 찾 을 때 입력 과 데이터 베 이 스 를 모두 대소 문자 로 통일 합 니 다.
declare
셸 은 부동 소수점 연산 을 할 수 없습니다.
itscs-MacBook-Pro:learnCommandLine itsc$ echo $((3.3+4.2))
-bash: 3.3+4.2: syntax error: invalid arithmetic operator (error token is ".3+4.2")
해결: perl, awk. 책 에서 가장 간단 한 bc 로
왜 부동 소수점 연산 도 지원 하지 않 습 니까?귀찮아.
배열
셸 배열 은 1 차원 배열 만 지원 합 니 다.
php 와 유사 합 니 다.배열 의 크기 를 지정 할 필요 가 없습니다.
배열 을 괄호 로 끌어안다.모든 요 소 를 빈 칸 으로 분할 합 니 다.
arr=(a1 a2 a3)
arr=(1 2 3)
${arr[0]}//1
a[1]=foo
echo ${a[1]}
foo
declare -a a
#
name[subscript]=value
name=(value1 value2 ...)
[me@linuxbox ~]$ days=(Sun Mon Tue Wed Thu Fri Sat)
[me@linuxbox ~]$ days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)
${arr[*]}
${#arr[*]}
[me@linuxbox ~]$ animals=("a dog" "a cat" "a fish")
[me@linuxbox ~]$ for i in ${animals[*]}; do echo $i; done
[me@linuxbox ~]$ for i in ${animals[@]}; do echo $i; done
[me@linuxbox ~]$ for i in "${animals[*]}"; do echo $i; done
[me@linuxbox ~]$ for i in "${animals[@]}"; do echo $i; done
bash 의 array 가 꼭 연속 되 는 것 은 아 닙 니 다.
그래서 어떤 위치 에 값 이 있 는 지 아 는 방법 이 필요 해 요.
[me@linuxbox ~]$ foo=([2]=a [4]=b [6]=c)
[me@linuxbox ~]$ for i in "${foo[@]}"; do echo $i; done
a
b
c
[me@linuxbox ~]$ for i in "${!foo[@]}"; do echo $i; done
2
4
6
${#arr[2]}
${arr[*]:0:2} //1 2
${arr[*]/3/5}
arr=("${arr[*]}" "test")
$ foo=(a b c)
$ foo[100]=e
$ echo ${foo[@]}
a b c e
$ foo+=(k l)
$ echo ${foo[@]}
a b c e k l
$ for i in "${foo[@]}"; do echo $i; done
a
b
c
e
k
l
$ for i in "${!foo[@]}"; do echo $i; done
0
1
2
100
101
102
subscript 는 연속 이 아 닙 니 다.
associative arrays
아래 표 시 는 문자 일 수 있 습 니 다.
연산 자
논리 연산 자
&& AND [[ $a -lt 100 && $b -gt 100 ]] false
|| OR [[ $a -lt 100 || $b -gt 100 ]] true
문자열 비교
= , true。 [ $a = $b ] false。
!= , true。 [ $a != $b ] true。
-z 0, 0 true。 [ -z $a ] false。
-n 0, 0 true。 [ -n $a ] true。
str , true。 [ $a ] true。
관계 연산 자
관계 연산 자 는 숫자 만 지원 합 니 다.
eq , true。 [ $a -eq $b ] false。
-ne , true。 [ $a -ne $b ] true。
-gt , , true。 [ $a -gt $b ] false。
-lt , , true。 [ $a -lt $b ] true。
-ge , , true。 [ $a -ge $b ] false。
-le , , true。 [ $a -le $b ] true。
a=10
b=20
if [[ $a eq $b ]];then
echo " "
fi
불 연산 자
! , true false, true。 [ ! false ] true。
-o , true true。 [ $a -lt 20 -o $b -gt 100 ] true。
-a , true true。 [ $a -lt 20 -a $b -gt 100 ] false。
파일 테스트 기호
b file , , true。 [ -b $file ] false。
-c file , , true。 [ -c $file ] false。
-d file , , true。 [ -d $file ] false。
-f file ( , ), , true。 [ -f $file ] true。
-g file SGID , , true。 [ -g $file ] false。
-k file (Sticky Bit), , true。 [ -k $file ] false。
-p file , , true。 [ -p $file ] false。
-u file SUID , , true。 [ -u $file ] false。
-r file , , true。 [ -r $file ] true。
-w file , , true。 [ -w $file ] true。
-x file , , true。 [ -x $file ] true。
-s file ( 0), true。 [ -s $file ] true。
-e file ( ) , , true。 [ -e $file ] true。
file=""
if [[-f $file ]]; then
echo "is a file"
fi
3. 절차 제어
3.1 if/else
if [condition];then
echo '1'
fi
# if else
if [condition]; then
echo '1'
else
echo '2'
fi
# if elseif else
if [condition];then
elif [condition];then
fi
x=5
if [ "$x" -eq 5 ]; then
echo "x equals 5."
else
echo "x does not equal 5."
fi
3.1.1 test
문법:
test expression
and the more popular:
[ expression ]
expression 은 true 일 때 0 으로 돌아 갑 니 다. 그렇지 않 으 면 1 로 돌아 갑 니 다. test 와 [본질 적 으로 같 습 니 다.
사용:
#!/bin/bash
# test-file: Evaluate the status of a file
FILE=~/.bashrc
if [ -e "$FILE" ]; then
if [ -f "$FILE" ]; then
echo "$FILE is a regular file."
fi
if [ -d "$FILE" ]; then
echo "$FILE is a directory."
fi
if [ -r "$FILE" ]; then
echo "$FILE is readable."
fi
if [ -w "$FILE" ]; then
echo "$FILE is writable."
fi
if [ -x "$FILE" ]; then
echo "$FILE is executable/searchable."
fi
else
echo "$FILE does not exist"
exit 1
fi
exit # ?
When a script “runs off the end” (reaches end of file), it terminates with an exit status of the last command executed.
String Expressions
#!/bin/bash
# test-string: evaluate the value of a string
ANSWER=maybe
if [ -z "$ANSWER" ]; then
echo "There is no answer." >&2
exit 1
fi
if [ "$ANSWER" = "yes" ]; then
echo "The answer is YES."
elif [ "$ANSWER" = "no" ]; then
echo "The answer is NO."
elif [ "$ANSWER" = "maybe" ]; then
echo "The answer is MAYBE."
else
echo "The answer is UNKNOWN."
Integer Expressions
test 옵션 이 정말 많아 요!!!
test 용 regex
[[]]
#
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
(( )) - Designed For Integers
$ if ((1)); then echo "It is true."; fi
It is true.
if ((INT == 0));
if ((INT < 0));
if (( ((INT % 2)) == 0));
Combining Expressions
Operation test [[ ]] and (( ))
AND -a &&
OR -o ||
NOT ! !
예시
# [[]]
if [[ "$INT" -ge "$MIN_VAL" && "$INT" -le "$MAX_VAL" ]];
# test
if [ "$INT" -ge "$MIN_VAL" -a "$INT" -le "$MAX_VAL" ];
Control Operators: Another Way To Branch
The && (AND) and || (OR)
$ mkdir temp && cd temp
$ [[ -d temp ]] || mkdir temp
[] 와 [] 의 차이
[[] 와 [] 는 같 지만 두 가지 새로운 특성 이 있 습 니 다.:
string1 =~ regex
== operator
[[] 와 표현 식 사이 에 빈 칸 이 있어 야 합 니 다.
[[ "$count" -gt 5 ]]
[[ "$count" -gt 5]] # ,
3.2 for
#
for variable [in words]; do
commands
done
# c
for (( expression1; expression2; expression3 )); do
commands
done
demo 예
[me@linuxbox ~]$ for i in A B C D; do echo $i; done
itscs-MacBook-Pro:~ itsc$ for i in {A..D}; do echo $i; done
# pathname expansion
itscs-MacBook-Pro:learnCommandLine itsc$ for i in dis*.txt; do echo "$i"; done
3.3 while 와 until
while
문법:
while commands; do commands; done
#!/bin/bash
# while-count: display a series of numbers
count=1
while [[ "$count" -le 5 ]]; do
echo "$count"
count=$((count + 1))
done
echo "Finished."
Breaking Out Of A Loop:break、continue、until
while 와 는 반대 입 니 다.
count=1
until [[ "$count" -gt 5 ]]; do
echo "$count
count=$((count + 1))
done
echo "Finished.
read file with loop
#!/bin/bash
# while-read
while read distro version release; do
printf "distro: %s\tversion: %s\treleased: %s
" \
"$distro" \
"$version" \
"$release"
done < distros.txt
3.4 case
#!/bin/bash
# case-menu
clear
echo "
please select:
1. display system information
2. display disk space
3. display home space utilization
0. quit
"
read -p "enter selection [0-3] > "
case "$REPLY" in
0) echo "program terminated"
exit
;;
1) echo "hostname: $HOSTNAME"
uptime
;;
2) df -h
;;
3) if [[ "$(id -u)" -eq 0 ]]; then
echo "home space utilization (all users)"
du -sh /home/*
else
echo "home space utilization ($USER)"
du -sh "$HOME"
fi
;;
*) echo "invalid entry" >&2
exit 1
;;
esa
3.5 종합
#! /bin/bash
a=10
b=20
#
if [[ $a -ne $b ]]; then
echo "a b"
fi
#
if [[ '$a' != '$b' ]]; then
echo "1"
fi
#
if [[ -d "../doc" ]]; then
echo "dirctory"
fi
if [[ ! -f "../routes" ]]; then
echo "not a file"
fi
#while
while [[ $a -gt 1 ]]; do
#statements
echo $a;
#
let a--
done
# for
for i in "wo" "rds"; do
echo $i
done
함수
function test(){}
# and the simpler (and generally preferred) form:
test(){}
function test(){
echo "hello"
}
test #
$n n
$1 은 첫 번 째 매개 변수 입 니 다.function test(){
echo $1 #
}
test 22 //22
funct_1 () {
local foo # variable foo local to funct_1
foo=1
echo "funct_1: foo = $foo"
}
외부 파일 도입
셸 에 서 는 외부 스 크 립 트 파일 을 도입 해 야 할 때 가 있 습 니 다. 다음 두 가지 방식 을 사용 해 야 합 니 다.
. ./a.sh
파일 에 source 사용 하기
source ./a.sh
6. 명령 행 수신 매개 변수
셸 스 크 립 트 를 실행 할 때 스 크 립 트 에 파 라 메 터 를 전달 합 니 다. 스 크 립 트 에서 파 라 메 터 를 가 져 오 는 형식 은 $n 입 니 다. n 은 하나의 숫자 를 대표 합 니 다. 1 은 스 크 립 트 를 실행 하 는 첫 번 째 매개 변수 이 고 2 는 스 크 립 트 를 실행 하 는 두 번 째 매개 변수 입 니 다.
$ bash test.sh test test2
$0 //test.sh
$1 //test
$# // 2
$*
basename , 。
for i in $*; do
echo $i
done
$$
$!
$? 0
위치 매개 변수 도 function 에 사용 할 수 있 습 니 다.
Difference between echo -e “” and echo $“”
e 의 뜻 은 확장, 전의 지원, e 와 $가 지원 하 는 기호 부분 이 다르다 는 것 이다.
* 8727 과 * 와 * 8727 과 @ 의 차이
작은 따옴표 가 붙 지 않 을 때 는 같 습 니 다. 빈 칸 을 만나면 분리 되 고 작은 따옴표 가 붙 을 때 는 다 릅 니 다. * 모든 매개 변 수 를 하나의 문자열 에 넣 습 니 다. * 모든 매개 변 수 를 하나의 문자열 에 넣 습 니 다. 8727 ° 모든 매개 변 수 를 하나의 문자열 에 넣 습 니 다. @ 입력 한 매개 변 수 를 각각 매개 변수 로 합 니 다. 즉, 입력 할 때의 빈 칸 을 구분 하지 않 습 니 다.
$@ 자주 사용 합 니 다.
7. 키보드 입력 읽 기
read – Read Values From Standard Input
read a single line of standard input.
read [-options] [variable…]
# -n option,suppresses the trailing newline on output
echo -n "Please enter an integer -> "
read int
read var1 var2 var3 var4 var5 #
# -p prompt
read -p "Enter one or more values > "
# -t seconds
# -s Silent mode.
if read -t 10 -sp "Enter secret passphrase > " secret_pass;
IFS
Internal Field Separator
file_info=$(grep "^$user_name:" $FILE)
# ,IFS command
IFS=":" read user pw uid gid name home shell <<< "$file_info"
here string
The <<< operator indicates a here string.
You Can’t Pipe read
함수 와 하위 함수 처럼 이런 종류 라면 pip 를 할 수 없습니다.
Validating Input
Menus
특이 하 다
자주 사용 하지 않 는, 특정 장면 에서 사용 하 는
Group Commands And Subshells
Group command:
{ command1; command2; [command3; ...] }
Subshell:
(command1; command2; [command3;...])
얘 네 뭐 하 는 애 들 이 야?
manage redirection
{ ls -l; echo "Listing of foo.txt"; cat foo.txt; } > output.txt
(ls -l; echo "Listing of foo.txt"; cat foo.txt) > output.txt
결합 pip
{ ls -l; echo "Listing of foo.txt"; cat foo.txt; } | lpr
대괄호 사용 주의
due to the way bash implements
group commands, the braces must be separated from the commands by a space and the
last command must be terminated with either a semicolon or a newline prior to the closing brace.
group 과 subshell 의 차이
subshell 은 이름 과 마찬가지 로 돌아 올 때 enviroment 를 잃 어 버 리 기 때문에 일반적으로 group 을 사용 합 니 다.
echo "foo" | read
echo $REPLY # subshell ,reply
commands in pipelines are always executed in subshells
process substitution
subshell 문 제 를 해결 하 는 데 사용 합 니 다.
read <<(echo "foo")
echo $REPLY
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.