Shell_기초 학습
학습 노트
기본 명령
명령 하 다.
용법 적 함의
$$
현재 프로 세 스 PID 가 져 오기
$#
매개 변수의 수 를 되 돌려 줍 니 다.
$!
마지막 으로 실행 중인 배경 프로 세 스 의 PID
n
첫 번 째 매개 변 수 를 n 번 째 매개 변수 값 으로 되 돌려 줍 니 다.
$@
모든 인자 되 돌리 기
$?
이전 명령 이 실 행 된 결 과 를 되 돌려 줍 니 다. 0: 실행 성공;1: 실행 실패
|
단일 세로 선, '|' 앞 명령 의 출력 을 '|' 뒤의 입력 으로 합 니 다.
||
두 세로 로 나 누 어 진 여러 명령 은 다음 과 같은 규칙 에 따라 실행 되 며, 이전 명령 이 사실 이 라면 뒤의 명령 은 실행 되 지 않 으 며, 이전 명령 이 가짜 라면 뒤의 명령 을 계속 수행 합 니 다.
&
& 명령 이 성공 하 든 안 하 든 여러 명령 을 동시에 수행 합 니 다.
&&
& & 여러 명령 을 동시에 실행 할 수 있 습 니 다. 잘못된 명령 을 수행 할 때 뒤의 명령 을 실행 하지 않 습 니 다.만약 계속 잘못된 것 이 없다 면, 집행 이 완료 된다.
exit
현재 프로 세 스 를 종료 합 니 다. 명령 은 종료 상 태 를 나타 내 는 전체 수 치 를 매개 변수 로 받 아들 일 수 있 습 니 다.지정 하지 않 으 면 기본 상태 값 은 0 입 니 다.0 은 성공 을 나타 내 고 0 이 아 닌 실 패 를 나타 낸다. 예 를 들 어 echo "befor exit"exit 8 echo "after exit"echo "$?"결 과 는 befor exit 8 이다.
-z
if 표현 식 [- z $string] string 이 비어 있 으 면 진짜 입 니 다.
-n
if 표현 식 [- n $string] string 이 비어 있 지 않 으 면 0 (true) 을 되 돌려 줍 니 다.
-s
if 표현 식 [- s FILE] FILE 가 존재 하고 크기 가 0 이 아니라면 진짜 입 니 다.
-a
if 표현 식 [- a FILE] FILE 가 존재 하면 진짜 입 니 다.
if 구문
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi
수치 판단
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=
\# *,\#\# *,% *,%% * 의 의미 및 용법
假设定义了一个变量为:
代码如下:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
% 是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
기호 $뒤의 괄호
cmd
효과 와 같 지만 일부 셸 버 전 은 tcsh 와 같은 $() 형식의 명령 교 체 를 지원 하지 않 습 니 다. expr exp
효과 가 같 습 니 다. 수학 식 exp 의 수 치 를 계산 합 니 다. 그 중에서 exp 는 C 언어의 연산 규칙 에 부합 하면 됩 니 다. 심지어 세 개의 연산 자 와 논리 식 까지 계산 할 수 있 습 니 다. /dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
重定向的使用有如下规律:
1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。
2)标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
3)文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&。
4)文件描述符与重定向符号之间不能有空格!
eg:
command < filename > filename2 把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中
command 0< filename 1> filename2 把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中
command > filename 2>&1 把标准输出和标准错误一起重定向到filename文件中(覆盖)
command >> filename 2>&1 把标准输出和标准错误一起重定向到filename文件中(追加)
command < filename 把标准输入重定向到filename文件中
command 0< filename 把标准输入重定向到filename文件中
command > filename 把标准输出重定向到filename文件中(覆盖)
command 1>> fielname 把标准输出重定向到filename文件中(追加)
소프트 연결
ln –s 源文件 目标文件
등호 와 이등 호의 차이
s1="foo"
s2="foo"
[ $1=$2 ] && echo "equal"
[ $1==$2 ] && echo "equal"
((a=5))
echo $a # 此时为赋值操作
((a==5)) && echo "equal" # 此时表示判断
작은 따옴표 와 작은 따옴표 의 차이
#!/bin/bash
url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2
运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net
소괄호 ()
① 명령 그룹. 괄호 안에 있 는 명령 은 키 셸 프로그램 을 새로 엽 니 다. 괄호 안에 있 는 변 수 는 로 컬 변수 이 므 로 스 크 립 트 의 다른 부분 에 서 는 사용 할 수 없습니다. 괄호 안에 있 는 여러 명령 은 분점 으로 구분 되 어 있 습 니 다. 비고: 괄호 안에 있 는 변 수 는 하위 셸 에 있 기 때문에 스 크 립 트 의 나머지 부분 은 사용 할 수 없습니다. 부모 프로 세 스, 즉 스 크 립 트 자체 에 서 는 하위 셸 에서 읽 을 수 없습니다.프로 세 스 에서 만 든 변수, 즉 하위 셸 에서 만 든 변수 입 니 다.
(cmd1;cmd2;cmd3)
② 명령 바 꾸 기. 명령 바 꾸 기 (cmd) 구 조 는 $(cmd) 의 cmd 를 한 번 실행 하고 출력 을 받 은 다음 이 출력 을 원래 명령 에 넣 습 니 다. 예 를 들 어:
[root@localhost tmp]# ls
fstab functions hellobash issue mytestdir scripts
[root@localhost tmp]# echo $(ls)
fstab functions hellobash issue mytestdir scripts
[root@localhost tmp]# echo `ls`
fstab functions hellobash issue mytestdir scripts
③ 배열 을 초기 화 하 는 데 사 용 됩 니 다. 예 를 들 어 arr = (m n)
대괄호 {}
① 확장. 대괄호 안에 있 는 파일 이름 을 확장 합 니 다. 대괄호 에 서 는 이 공백 이 인용 되 거나 전의 되 지 않 는 한 공백 이 있 을 수 없습니다. 확장 은 보통 쉼표 (,) 로 나 뉘 어 확장 합 니 다. 예 를 들 어 echo {a, b}. txt 는 간격 이 있 는 각 내용 을 모두 표시 합 니 다. echo {1.5}. txt 는 1 에서 5 중간 내용 을 자동 으로 보완 합 니 다.
[root@localhost ~]# echo {a,b}.txt
a.txt b.txt
[root@localhost ~]# echo {1..5}.txt
1.txt 2.txt 3.txt 4.txt 5.txt
② 내부 그룹. 작은 괄호 안에 있 는 명령 과 달리 큰 괄호 안에 있 는 명령 은 현재 셸 에서 실 행 됩 니 다. 하위 셸 을 다시 열지 않 습 니 다. 괄호 안에 있 는 명령 은 분점 으로 구분 되 며, 마지막 명령 은 분점 으로 구분 되 어야 합 니 다. {} 의 첫 번 째 명령 과 왼쪽 괄호 사이 에 빈 칸 이 있어 야 합 니 다.
쌍 소괄호 ()
for((...;...;...))
do
cmd
done
while ((...))
do
cmd
done
기타 작은 지식
ps|grep "${pname}" |grep -v "grep"|grep -v grep|awk '{print $1}' > "supertack.pid"
- 如果是2个pid,则此时文件supertack.pid中会保存为:
1234
1235
- 可以通过如下方式将2行内容输出到同一行,并以空格分隔开:
fpid=$(echo $(cat ${supertack_pid}))
echo $fpid
输出为:1234 1235
然后在 kill -9 $fpid
tick_times="a_ticktack_times.log"
ticktimes=20
control_tick(){
[ -s "${tick_times}" ] && { ticktimes=$(cat ${tick_times});}
[ -z "${ticktimes}" ] && { echo "1">${tick_times};ticktimes=1;}
debug_print "control_tick ticktimes=$ticktimes"
if [ `expr $ticktimes % 20` == 0 ];then
echo "1">${tick_times}
return 8;
else
ticktimes=$(expr $ticktimes + 1);
echo "${ticktimes}">${tick_times}
return 7;
fi
}
work(){
control_tick
is_tick=$?
[ "${is_tick}" = 7 ] && { echo "TICK WAIT ,is_tick=fase[$is_tick]" && return 1 ; }
do something;
}
f_jparse() {
echo $1 | \
sed -e 's/[{}]//g' | \
sed -e 's/", "/","/g' | \
sed -e 's/" ,"/","/g' | \
sed -e 's/" , "/","/g' | \
sed -e 's/","/'\"---RECORDSEPERATOR---\"'/g' | \
awk -v RS='---RECORDSEPERATOR---' "\$1~/^\"$2\"/ {print}" | \
sed -e "s/\"$2\"://"| sed 's/\"//g'|sed -e 's/\(^ *\)//' -e 's/\( *$\)//'
}
json={
'type':1,
'name':123
}
xurl=$(f_jparse "$json" 'type')
echo $xurl
输出:1
현재 프로젝트 에서 이런 지식 만 사용 하고 나중에 총 결 을 만나면
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.