셸 기초 연습

32756 단어 Linux
글 목록
  • 1. 통계 파일 과 디 렉 터 리 의 개수 (하위 디 렉 터 리 포함 하지 않 음)
  • 2. 파일 을 대량으로 만 듭 니 다.
  • 3. 파일 이름 대량 수정
  • 4. 포트 번호 에 따라 프로 세 스 pid 가 져 오기 (centos 7 적용 되 지 않 음)
  • 5. 대량 복사
  • 6. while 연습
  • 7. case 연습
  • 8. 파일 의 group 형식 사용자 가 쓰기 권한 이 없 으 면 쓰기 권한 을 추가 합 니 다.
  • 9. 날짜 에 따라 파일 생 성
  • 10. 아래 포트 가 열 렸 는 지 확인
  • 11. 날짜 간 의 차 이 를 계산한다
  • 12. for 연습
  • 1. 통계 파일 과 디 렉 터 리 의 개수 (하위 디 렉 터 리 포함 하지 않 음)
  • 방법 1 (소프트 연결 을 파일 로 계산 합 니 다)
  • #!/bin/bash
    
    path="/home/learner1/dir1211/*"
    
    i=0
    j=0
    
    for file in $path ; do
       if [ -f $file  ]; then
            echo "file : $file"
    	((i++))
       fi
       if [ -d $file  ]; then
            echo "dir : $file"
    	((j++))
       fi
    done
    
    echo "       $i"
    echo "       $j"
    
    
  • 방법 2 (소프트 연결 을 파일 로 계산 하지 않 음)
  • #!/bin/bash
    
    fileCount=`ls -l ~/dir1211|grep -c  "^-"`
    dirCount=`ls -l ~/dir1211 |grep -c  "^d"`
    echo "      $fileCount"
    echo "      $dirCount"
    

    2. 파일 을 대량으로 생 성 합 니 다.
    홈 디 렉 터 리 에 하위 디 렉 터 리 애플 스 를 만 들 고 애플 스 디 렉 터 리 에 10 개의 파일 을 만 듭 니 다. 파일 이름 a0. txt a1. txt a2. txt...
    echo "      "
    cd ~
    
    
    if [ -d ~/apples ]
    then
            echo "     "
    else
            echo "      apples"
            mkdir apples
    fi
    
    cd ~/apples
    for (( i=0; i<10 ; i++ ))
    do
    touch  a$i.txt
    done
     echo "  "
    

    3. 파일 이름 일괄 수정
  • 현재 디 렉 터 리 만 수정
  • #!/bin/bash
    for files in `ls`
    do
        #            
        fname=${files:0:2}
        #           
        bname=${files:0-4}
        #       
        filename=$fname$bname
        #      
        mv $files $filename
    done
    
    
  • 현재 디 렉 터 리 및 하위 디 렉 터 리 의 파일 접미사 이름 수정 (부모 디 렉 터 리 를 매개 변수 로 전달)
  • mvFileName(){
     for element in `ls $1` ; do
         obj=$1"/"$element
         if [ -d $obj ]; then
             mvFileName $obj
         else
            oriName=${obj%.txt}
            echo $oriName
           mv $obj $oriName'.data'
         fi
     done
    }
    
    mvFileName $1
    
    

    4. 포트 번호 에 따라 프로 세 스 pid 가 져 오기 (centos 7 적용 되 지 않 음)
    #!/bin/bash
    echo "           "
    read addresspid=`sudo netstat -anp |grep :$address |cut -c 89- | cut -d / -f 1 `
    #echo "$pid"
    if [[ -n $pid ]];then
    #echo ${pid%/*} | cut -f 7 -d " "
     echo $pid
    else
     echo "       "
    fi
    
    

    5. 대량 복사
  • (1) 현재 디 렉 터 리 에 있 는 c 파일 을 지정 한 디 렉 터 리 에 복사 하고 이동 한 디 렉 터 리 의 내용 을 파일 크기 에 따라 표시 합 니 다.
  • #!/bin/bash
    for file in *.c
    do
      cp ${file}${1}
    done
    ls ${1} –S
    
    
  • (2) 지 정 된 디 렉 터 리 중 2 일 이내 에 수 정 된 파일 을 target 디 렉 터 리
  • 로 복사 합 니 다.
    #!/bin/bash
    for tmpFile in `find .   -mtime -2`;  do
        if [ -f "$tmpFile"  ]; then
          cp $tmpFile ~/target
        fi
    done
    

    6. while 연습
  • (1) 사용자 가 'end' 를 입력 할 때 까지 수 치 를 입력 합 니 다
  • unset var
    while [ "$var" != "end" ]; do
        echo -n "please input a number: "
        read var
        if [ "$var" = "end" ]; then
            break
        fi
        echo "var is $var"
    done
    
    
  • (2) 사용자 가 yes 또는 YES 를 입력 해 야 프로그램의 실행 이 끝 납 니 다. 그렇지 않 으 면 사용자 에 게 입력 문자열 을 계속 알려 줍 니 다
  • #!/bin/bash
    # Program:
    #  Repeat question until user input correct answer.
    
    while [ "${yn}" != "yes" -a "${yn}" != "YES" ]
    do
    read -p "Please input yes/YES to stop this program: " yn
    done
    echo "OK! you input the correct answer."
    
    
  • (3) 1 부터 100 까지 의 합
  • 을 계산한다.
     #!/bin/bash
    # Program:
    #  Use loop to calculate "1+2+3+...+100" result.
    s=0 #          
    i=0 #        ,    1, 2, 3....
    while [ "${i}" != "100" ]
    do
    i=$(($i+1)) #    i      1
    s=$(($s+$i)) #         !
    done
    echo "The result of '1+2+3+...+100' is ==> $s"
    
    

    7. 케이스 연습
    스 크 립 트 를 작성 하여 다음 과 같은 기능 을 수행 합 니 다. 숫자 를 입력 하고 해당 하 는 명령 을 실행 합 니 다.다음 명령 을 표시 합 니 다: cmd meau * 1 – date 2 – ls 3 – who 4 – pwd 는 1 을 입력 하면 date 명령 을 실행 하고 2 를 입력 하면 ls 를 실행 합 니 다.
    #! /bin/bash
    echo "*cmd meau**"
    echo "1--date"
    echo "2--ls"
    echo "3--who"
    echo "4--pwd"
    read -p "please input a num:" n
    case $n in
        1)
        date
       ;;
        2)
        ls
        ;;
        3)
        who
        ;;
        4)
        pwd
        ;;
        *)
        echo "please input 1-4"
        ;;
    esac
    
    

    8. 파일 의 group 형식 사용자 가 쓰기 권한 이 없 으 면 쓰기 권한 을 추가 합 니 다.
    #!/bin/bash
    path=~/dir1211/learnShell/multiFileDir/
    for X in ${path}* ; do
            a=`ls -l $X | cut -c 6`
            if [ "$a" == "-" ] ; then
                    chmod g+w $X
            fi
    done  
    
    

    9. 날짜 에 따라 파일 생 성
    사용자 에 게 파일 이름 (예: ws) 을 입력 하고 그저께, 어제, 오늘 의 파일 (예: ws 20181214 ws 20181215 ws 20181216) 을 생 성 하 라 고 알려 줍 니 다.
    #!/bin/bash
    # Program:
    #  Program creates three files, which named by user's input and date command.
    
    # 1.          ,    fileuser     ;
    echo -e "I will use 'touch' command to create 3 files." #       
    read -p "Please input your filename: " fileuser #        
    # 2.            Enter ,               ?
    filename=${fileuser:-"filename"} #            
    # 3.      date             ;
    for (( VAR = 0; VAR < 3; ++VAR )); do
        date1=$(date --date="${VAR} days ago" +%Y%m%d) #  N    
        file1=${filename}${date1} 
        touch "${file1}" 
    done
    
    

    10. 아래 포트 가 열 렸 는 지 확인 합 니 다.
    흔히 볼 수 있 는 port 와 관련 네트워크 서비스의 관 계 는 80: WWW 22: ssh 21: ftp 25: mail 이다.
    #!/bin/bash
    i=0
    a=(:80
       :22  
       :21  
       :25)
    for X in 'WWW' 'ssh ' 'ftp' 'mail' ; do
            a=`sudo netstat -nltp | grep ${a[$i]}`
            if [ -n "$a" ] ; then
                     echo $X    
            else
                     echo $X    
            fi
            ((i++))
    done
    
    

    11. 날짜 간 의 차 이 를 계산한다.
    #!/bin/bash
    # Program:
    #  You input your demobilization date, I calculate how many days before you demobilize.
    # 1.            ,              ?
    echo "This program will try to calculate :"
    echo "How many days before your demobilization date..."
    read -p "Please input your demobilization date (YYYYMMDD ex>20150716): " date2
    # 2.     ,           ?        ~
    date_d=$(echo ${date2} |grep '[0-9]\{8\}') #          
    if [ "${date_d}" == "" ]; then
    echo "You input the wrong date format...."
    exit 1
    fi
    # 3.        ~
    declare -i date_dem=$(date --date="${date2}" +%s) #       
    declare -i date_now=$(date +%s) #       
    declare -i date_total_s=$((${date_dem}-${date_now})) #       
    declare -i date_d=$((${date_total_s}/60/60/24)) #     
    if [ "${date_total_s}" -lt "0" ]; then #        
    echo "You had been demobilization before: " $((-1*${date_d})) " ago"
    else
    declare -i date_h=$(($((${date_total_s}-${date_d}*60*60*24))/60/60))
    echo "You will demobilize after ${date_d} days and ${date_h} hours."
    fi
    

    12. for 연습
  • (1) 시스템 의 각종 계 정 이/etc/passwd 에 적 힌 첫 번 째 필드 이기 때문에 파이프라인 명령 의 cut 를 통 해 단순 한 계 정 이름 을 찾 을 수 있 습 니까?
  • #!/bin/bash
    # Program
    # Use id, finger command to check system account's information.
    # History
    # 2015/07/17 VBird first release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    users=$(cut -d ':' -f1 /etc/passwd) #       
    for username in ${users} #       !
    do
    id ${username}
    done
    
    
  • (2). ping 랜 내 100 대의 기계 가 사용 가능 한 지 확인
  • #!/bin/bash
    # Program
    # Use ping command to check the network's PC state.
    network="192.168.1" #             !
    for sitenu in $(seq 1 100) # seq   sequence(  )      
    do
    #          ping              !
    ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
    #              (UP)           (DOWN)
    if [ "${result}" == 0 ]; then
    echo "Server ${network}.${sitenu} is UP."
    else
    echo "Server ${network}.${sitenu} is DOWN."
    fi
    done
    
    
  • (3). 셸 프로그램 을 설계 하고 새로운 그룹 을 class 1 로 추가 한 다음 에 이 그룹 에 속 하 는 30 명의 사용 자 를 추가 합 니 다. 사용자 이름 의 형식 은 stdxx 이 고 그 중에서 xx 는 01 에서 30 까지 입 니 다.
  • #!/bin/sh  
    i=1  
    groupadd class1  
    while [ $i -le 30 ]  
    do  
    if [ $i -le 9 ] ;then  
    	USERNAME=stu0${i}  
    else  
    	USERNAME=stu${i}  
    fi  
    useradd $USERNAME  
    mkdir /home/$USERNAME  
    chown -R $USERNAME /home/$USERNAME  
    chgrp -R class1 /home/$USERNAME  
    i=$(($i+1))  
    done  
    
    

    좋은 웹페이지 즐겨찾기