Shell 기본 동작

글 목록
  • 1. 기초
  • 1.1 함수 파라미터
  • 1.2 '와 $()
  • 1.3\\$var 와 ${var}
  • 1.3.1 경로, 파일 이름, 접미사
  • 1.3.2 하위 문자열 및 교체
  • 1.3.3 상태 에 따라 변수 할당
  • 1.4 산수 연산
  • 1.2. 판정
  • 1.2.1 공동 판정
  • 1.2.2 정수 비교
  • 1.2.3 문자열 비교
  • 1.2.4 파일 테스트
  • 2. 배열
  • 2.1 배열 만 들 기
  • 2.2 배열 요소 접근
  • 2.3 삭제
  • 3. 관련 배열 (map)
  • 3.1 창설
  • 3.2 배열 요소 할당
  • 3.3 옮 겨 다 니 기
  • 5. 순환
  • 5.1 for
  • 5.2 while
  • 6 기타
  • 6.1 ssh
  • 에 대하 여
    1. 기초
    1.1 함수 매개 변수
    매개 변수 처리
    설명 하 다.
    $#
    스 크 립 트 에 전 달 된 매개 변수 개수
    $*
    스 크 립 트 에 전 달 된 모든 인 자 를 단일 문자열 로 표시 합 니 다.
    $$
    스 크 립 트 가 실행 중인 현재 프로 세 스 ID 번호
    $!
    백그라운드 에서 실행 중인 마지막 프로 세 스 의 ID 번호
    $@
    $* 와 같 지만 사용 할 때 따옴표 를 추가 하고 따옴표 에서 매개 변 수 를 되 돌려 줍 니 다.
    $?
    마지막 명령 의 종료 상 태 를 표시 합 니 다.0 은 오류 가 없 음 을 나타 내 고 다른 값 은 오류 가 있 음 을 나타 낸다.
    PS: $@ 과 $의 차이 점: (1) 방문 할 때 argA = $@ 이 라 고 쓰 면;argB = $, argA 는 argB 와 같 습 니 다.(2) 방문 할 때 argA = "$@"이 라 고 쓰 면;argB = "$*"는 argA 를 매개 변수 로 하 는 목록 이 고 argB 는 모든 매개 변 수 를 하나의 전체 로 하고 긴 문자열 로 생각 합 니 다.
    또한 매개 변수 개수 가 9 보다 많 을 때 가 져 온 매개 변 수 는 괄호 를 쳐 야 합 니 다. 예 를 들 어 ${10}
    1.2 '와 $() 에 대하 여
    http://www.cnblogs.com/chengd/p/7803664.html bash 에서 $() 와 (反引号)都是用来作命令替换的。
    命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。

    优缺点:
    (1) : $(): 该种写法更容易读,而``容易看错。
    (2): $( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的

    1.3 $var与${var}

    $var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围

    另外,关于${}符号的特殊用法

    1.3.1 取路径、文件名、后缀

    先赋值一个变量为一个路径,如下:
    file=/dir1/dir2/dir3/my.file.txt
    
    命令    解释    结果
    ${file#*/}    拿掉第一条 / 及其左边的字符串    dir1/dir2/dir3/my.file.txt
    [root@localhost ~]# echo ${file#*/}
    dir1/dir2/dir3/my.file.txt
    
    ${file##*/}    拿掉最后一条 / 及其左边的字符串    my.file.txt
    [root@localhost ~]# echo ${file##*/}
    my.file.txt
    
    ${file#*.}    拿掉第一个 . 及其左边的字符串    file.txt
    [root@localhost ~]# echo ${file#*.}
    file.txt
    
    ${file##*.}    拿掉最后一个 . 及其左边的字符串    txt
    [root@localhost ~]# echo ${file##*.}
    txt
    
    ${file%/*}    拿掉最后一条 / 及其右边的字符串    /dir1/dir2/dir3
    [root@localhost ~]# echo ${file%/*}
    /dir1/dir2/dir3
    
    ${file%%/*}    拿掉第一条 / 及其右边的字符串    (空值)
    [root@localhost ~]# echo ${file%%/*}
    (空值)
    
    ${file%.*}    拿掉最后一个 . 及其右边的字符串    /dir1/dir2/dir3/my.file
    [root@localhost ~]# echo ${file%.*}
    /dir1/dir2/dir3/my.file
    
    ${file%%.*}    拿掉第一个 . 及其右边的字符串    /dir1/dir2/dir3/my
    [root@localhost ~]# echo ${file%%.*}
    /dir1/dir2/dir3/my
    记忆方法如下:
    
    # 是去掉左边(在键盘上 # 在 $ 之左边)
    % 是去掉右边(在键盘上 % 在 $ 之右边)
    单一符号是最小匹配;两个符号是最大匹配
    *是用来匹配不要的字符,也就是想要去掉的那部分
    还有指定字符分隔号,与*配合,决定取哪部分
    

    1.3.2 取子串及替换

    命令                                    解释                              结果
    ${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
    ${#file}              获取变量长度                     27   
    

    1.3.3 根据状态为变量赋值

    命令 解释 备注
    ${file-my.file.txt} 若 $file 没设定,则使用 my.file.txt 作传回值 空值及非空值不作处理
    ${file:-my.file.txt} 若 $file 没有设定或为空值,则使用 my.file.txt 作传回值 非空值时不作处理
    ${file+my.file.txt} 若$file 设为空值或非空值 ,均使用my.file.txt作传回值 没设定时不作处理
    ${file:+my.file.txt} 若 $file 为非空值,则使用 my.file.txt 作传回值 没设定及空值不作处理
    ${file=txt} 若 $file 没设定,则回传 txt ,并将 $file 赋值为 txt 空值及非空值不作处理
    ${file:=txt} 若 $file 没设定或空值,则回传 txt ,将 $file 赋值为txt 非空值时不作处理
    ${file?my.file.txt} 若 $file 没设定,则将 my.file.txt 输出至 STDERR 空值及非空值不作处理
    ${file:?my.file.txt} 若 $file没设定或空值,则将my.file.txt输出至STDERR 非空值时不作处理

    PS: 中间有=号的,是对file变量赋值;
    中间是?的是设定输出的
    中间是+或-的是,是影响的${}的整体赋值 如,var=${flag-d},影响的是var的值。

    1.4 算数运算

    在Bash的算术运算中有以下几种方法:

    名称 语法 范例
    算术扩展 ((算术式)) r=((1+2*3))
    使用外部程序expr expr 算术式 r=expr 1+2*3사용 []
    [산술 식]
    r=$[1+2]
    내 장 된 명령 사용
    declare - i 변수 = 산술 식
    declare -i r=1+2*3
    내 장 된 명령 let 사용 하기
    let 산술 식
    let r=1+2
    판정
    1.2.1 공동 판정
    -a: and -o: or !: ... 이 아니다
    1.2.2 정수 비교
    -eq 测试两个整数是否相等
    -ne 测试两个整数是否不等
    -gt 测试一个数是否大于另一个数
    -lt 测试一个数是否小于另一个数
    -ge 大于或等于
    -le 小于或等于
    

    명령 간 의 논리 관계 논리 와: & & 첫 번 째 조건 은 가짜 이 고 두 번 째 조건 은 판단 하지 않 아 도 됩 니 다. 가장 전체적인 결 과 는 첫 번 째 조건 이 진실 이 고 두 번 째 조건 은 반드시 판단 해 야 합 니 다.
    논리 또는: | |
    1.2.3 문자열 비교
    == 等于  两边要有空格
    != 不等
    >  大于
    <  小于
    

    1.2.4 파일 테스트
    -z string 测试指定字符是否为空,空着真,非空为假
    -n string 测试指定字符串是否为不空,空为假 非空为真
    -e FILE 测试文件是否存在
    -f file 测试文件是否为普通文件
    -d file 测试指定路径是否为目录
    -r file 测试文件对当前用户是否可读
    -w file 测试文件对当前用户是否可写
    -x file 测试文件对当前用户是都可执行
    -z  是否为空  为空则为真
    -a  是否不空	
    

    2. 배열
    2.1 배열 만 들 기
    배열 정의, 중간 에 빈 칸 분할: array = ("val 1"val 2 ") 기 존 배열 에 따라 새로운 배열 을 만 듭 니 다: newarry = (${array 1 [@]} ${array 2 [@]})
    2.2 배열 요소 접근
    (1) 단일 원소 arr 방문number [$index] = 100 (index 가 경 계 를 넘 으 면 새 할당 값 이 배열 의 끝 에 추 가 됩 니 다)
    (2) 블록 접근 블록 접근 형식 은: ${배열 이름 [@ 또는 *]: 시작 아래 표시: 끝 아래 표시} 입 니 다. 아래 표 시 를 끝 내 는 요 소 는 포함 되 지 않 습 니 다.
    2.3 삭제
    어떤 요 소 를 삭제 합 니 다: unset arr number [1]. 아래 표 시 된 배열 을 삭제 합 니 다.
    전체 배열 비우 기: unset arr number;
    3. 관련 배열 (map)
    3.1 창설
    declare -A arraymap
    3.2 배열 요소 할당
    maparray=(lucy]=beijing [yoona]=shanghai) maparray[key]=value
    3.3 옮 겨 다 니 기
    키 목록 가 져 오기: ${! maparray [*]}
    5. 순환
    5.1 for
    기본 모드:
    for var in list ; do
    
      commands
    
    done
    

    C 스타일 의:
    for (( i = 0; i < 10; i++ ));do
    
      commands
    
    done
    

    5.2 while
    while command;do
    
      commands
    
    done
    

    6 기타
    6.1 ssh 에 대하 여
    (1) 원 격 으로 명령 ssh 실행user@host"cmd"(2) 여러 명령 을 원 격 으로 실행 하고 여러 명령 을 원 격 으로 실행 할 때 명령 이 5 개 정도 면 명령 집합 을 ""로 감 싸 고 명령 사이 에 점 수 를 붙 여 실행 할 수 있 습 니 다.(expect 에서 ssh 를 실행 하면 잘못된 것 같 습 니 다. 첫 번 째 문장 만 이해 할 수 있 습 니 다. ssh 가 - t 인 자 를 추가 하거나 ssh 를 사용 해 야 하 는 지 아 닙 니까?user@hostbash - c 모드? 확실 하지 않 습 니 다. 나중에 ssh 인 자 를 모두 보 세 요. 여기 가 잘 모 르 는 것 같 습 니 다.) 명령 이 많 을 때 명령 을 스 크 립 트 에 쓰 고 ssh 를 통 해 이 스 크 립 트 를 실행 하 는 것 이 좋 습 니 다.
    스 크 립 트 는 로 컬 과 원 격 기기 에 있 습 니 다. 스 크 립 트 는 로 컬 에 있 습 니 다.
    ssh user@host< scriptName 스 크 립 트 에 인 자 를 입력 하려 면 bash 에 - s 인 자 를 지정 해 야 합 니 다.
    ssh user@host ‘bash -s’ < scriptName helloworld
    원 격 대상 기 에서 스 크 립 트 sshuser@host “/home/scriptName”
    매개 변수: sshuser@host/home/nick/test.sh helloworld

    좋은 웹페이지 즐겨찾기