Shell Scripting Exercises

Source: Internet
Author: User
Tags case statement echo 7 pkill



This article mainly introduces examples of shell programming


First, the logical judgment if statement 1. Judging the age?

[[email protected] 9_1] #cat iftest.sh
#! / bin / bash
read -p "Please input your age:" age
## Judge that the user input must be a number
if [["$ age" = ~ ^ [0-9] + $]]; then
    true
else
    echo "Please input digit"
    exit 10
fi
## Determine the age of the user and output the corresponding information
if ["$ age" -ge 0 -a $ age -le 18]; then
    echo "good good study, day day up"
elif ["$ age" -gt 18 -a $ age -le 60]; then
## Since it has been judged to be a number and a positive integer, "$ age" -gt 18 can be omitted;

    echo "work hard"
elif ["$ age" -gt 60 -a $ age -le 120]; then
## Similarly, here "$ age" -gt 60 can also be omitted, optimized
    echo "enjoy your life"
else
    echo "you don not come from the earch"
fi
2. How to judge yes or no?
Idea 1:
1. All choices entered by the user: y | yes | Y | YES, same as n | no | N | NO
2. Unified judgment is uppercase or lowercase: tr to convert
3. Use two choices to judge: 2: Use regular matching y | yes; n | no or uppercase

#! / bin / bash
read -p "Input yes or no:" answer
ans = `echo" $ answer "| tr‘ A-Z ’‘ a-z’`

if ["$ ans" = "yes" -o "$ ans" = "y"]; then
        echo "YES"
elif ["$ ans" = "no" -o "$ ans" = "n"]; then
        echo "NO"
else
        echo "Please input yes or no"
fi
Idea 2: Use regular to judge

#! / bin / bash
read -p "Input yes or no:" answer
if [["$ answer" = ~ ^ [Yy] ([Ee] [Ss])? $]]; then
        echo YES
elif [["$ answer" = ~ ^ [Nn] [Oo]? $]]; then
        echo "NO"
else
        echo "Please input yes or no"
fi
4. Determine whether you are rich or handsome?
[[email protected] 9_1] #vim yesorno2.sh
#! / bin / bash
read -p "Are you rich? yes or no:" answer
if [["$ answer" = ~ ^ [Yy] ([Ee] [Ss])? $]]; then
        echo OK
elif [["$ answer" = ~ ^ [Nn] [Oo]? $]]; then
        read -p "Are you handsome? yes or no:" answer
        if [["$ answer" = ~ ^ [Yy] ([Ee] [Ss])? $]]; then
                echo Ok
                exit
        elif [["$ answer" = ~ ^ [Nn] [Oo]? $]]; then
                echo "work hard"
        else
                echo "Please input yes or no"
        fi
else
        echo "Please input yes or no"
fi
Second, the case statement of logical judgment 1. Judgment of numbers
[[email protected] 9_1] #vim casetest.sh
#! / bin / bash

read -p "Please input a digit:" num
case $ num in
1 | 2 | 3)
        echo 1,2,3
        ;;
4 | 5 | 6)
        echo 4,5,6
        ;;
7 | 8 | 9)
        echo 7,8,9
        ;;
*)
        echo other digit
        ;;
esac
2. Judge yes | no
#! / bin / bash
read -p "Please input yes or no:" ans
case $ ans in
[Yy] | [Yy] [Ee] [Ss])
    echo YES
    ;;
[Nn] | [Nn] [Oo])
    echo NO
    ;;
*)
    echo input false
    ;;
esac
3. Print menu:
[[email protected] ~] #cat menu.sh
#! / bin / bash

cat << EOF
1: lamian
2: huimian
3: daoxiaomian
4: junbing
5: mifan
EOF

read -p "Please choose the number:" num
case $ num in
1) 
    echo "lamian price is 15"
    ;;
2)
    echo "huimian price is 18"
    ;;
3)
    echo "daoxiaomian price is 13"
    ;;
4)
    echo "junbing price is 10"
    ;;
5)
    echo "mifan price is 2"
    ;;
*)
    echo "INPUT false"
esac

effect:
[[email protected] ~] #sh menu.sh
1: lamian
2: huimian
3: daoxiaomian
4: junbing
5: mifan
Please choose the number: 5
mifan price is 2
Third, the loop for loop
help for-two kinds of syntax
Syntax 1:
for NAME [in WORDS ...]; do COMMANDS; done
Syntax 2:
for ((: for ((exp1; exp2; exp3)); do COMMANDS; done

[[email protected] 9_2] #for num in 1 2 3 4 5; do echo "num = $ num"; done
num = 1
num = 2
num = 3
num = 4
num = 5
1. Continue to add sums
[[email protected] 9_2] # sum = 0; for num in 1 2 3 4 5; do sum = $ [sum + num]; done; echo sum = $ sum
sum = 15
2. Find the sum of 1 + 2 + 3 + .. + 100 (Interview questions)
Method 1: {1..100} Generate sequence
[[email protected] 9_2] # sum = 0; for num in {1..100}; do sum = $ [sum + num]; done; echo sum = $ sum
sum = 5050
## The methods used for calculation are $ [] and $ (()), let, and so on.

Method 2: seq 100 generates sequence
[[email protected] 9_2] # sum = 0; for num in `seq 100`; do sum = $ [sum + num]; done; echo sum = $ sum
sum = 5050
2.1 Find the sum of all odd numbers within 1 + 2 + 3 + .. + 100 | the sum of all even numbers?
Sum of odd numbers:

[[email protected] ~] # sum = 0; for num in {1..100..2}; do sum = $ [sum + num]; done; echo sum = $ sum
sum = 2500
[[email protected] ~] # sum = 0; for num in `seq 1 2 100`; do sum = $ [sum + num]; done; echo sum = $ sum
sum = 2500
Sum of even numbers:

[[email protected] ~] # sum = 0; for num in {2..100..2}; do sum = $ [sum + num]; done; echo sum = $ sum
sum = 2550
[[email protected] ~] # sum = 0; for num in `seq 2 2 100`; do sum = $ [sum + num]; done; echo sum = $ sum
sum = 2550
2.2 How to print odd and even numbers?
[[email protected] 9_2] #seq 1 2 10 ———— Print odd number
1
3
5
7
9
[[email protected] 9_2] #seq 2 2 10 ———— Print even number
2
4
6
8
10
[[email protected] 9_2] #seq 1 10 | sed -n "1 ~ 2p" —————— sed print odd number
1
3
5
7
9
[[email protected] 9_2] #seq 1 10 | sed -n "2 ~ 2p" ———————— sed print even number
2
4
6
8
10
[[email protected] ~] #echo {1..10..2} ———————————————— {} can also output odd
1 3 5 7 9
[[email protected] ~] #echo {2..10..2} ———————————————— {} Print even number
2 4 6 8 10
3. Exercise: How to batch execute all scripts in a directory? ———— (Prerequisite: All files have x permissions and are non-interactive)
[[email protected] 9_2] #ls
case_yesorno.sh test.sh
[[email protected] 9_2] #
[[email protected] 9_2] #for filename in * .sh; do ./$filename;done
Please input yes or no: yes
YES
hello, world
4. Exercise: Create user1..10 users in batches and set the password to magedu. Set the first login to change the password?
[[email protected] 9_2] #vim createuser_n.sh
#! / bin / bash
for num in {1..10}; do
         useradd user $ {num}
         echo "magedu" | passwd --stdin user $ {num} &> / dev / null
         passwd -e user $ {num} &> / dev / null
done
5. Exercise: Write a XX scanner to scan a network segment (1-254). Which hosts are turned on?
## The default is sequential execution. After ping one ip and then ping the next, can it be executed in parallel?
[[email protected] 9_2] #cat scanip.sh
#! / bin / bash
## Empty the file before each execution
> /data/iplist.log
net = 172.20.129
for i in {1..254}; do
## Add {} to achieve parallel execution
    {if ping -c1 -W1 $ net. $ i &> / dev / null; then
        echo $ net. $ i is up
        echo $ net. $ i >> /data/iplist.log ## Note that this is an append, so empty the file at the beginning of the script
    else
        echo $ net. $ i is down
    fi} & ## correspond back and forth, and put into the background to execute
done
wait ## Because you need to manually press enter to exit, add the wait command to automatically exit

Optimized version: interactive input
[[email protected] 9_2] #vim scanip.sh
#! / bin / bash
> /data/iplist.log
## Interactive input
read -p "Please input the network: (eg: 192.168.0.0):" net
## Intercept the first three paragraphs, otherwise 1.1.1.0.249
net = `echo $ net | cut -d. -f1-3`
for i in {1..254}; do
        {if ping -c1 -W1 $ net. $ i &> / dev / null; then
                echo $ net. $ i is up
                echo $ net. $ i >> /data/iplist.log
        else
                echo $ net. $ i is down
        fi} &
done
wait
6. Exercise: Write a netid.sh that calculates the network ID, ip address and subnet mask to do AND operation, as shown below:
[[email protected] 9_2] #echo $ [193 & 240]
192

[[email protected] 9_2] #cat netid.sh
#! / bin / bash
read -p "input a ip:" ip
read -p "input a netmask:" netmask
## One field per cut, and then loop 4 times
for i in {1..4}; do
    net = `echo $ ip | cut -d. -f $ i`
    mask = `echo $ netmask | cut -d. -f $ i`
    if [$ i -eq 1]; then
## The first field is combined with the other field, and finally combined
        netid = $ [net & mask]
    else
        netid = $ netid. $ [net & mask]
    fi
done
echo netid = $ netid

Optimized version:
[[email protected] 9_2] #cat netid.sh
#! / bin / bash
read -p "input a ip:" ip
read -p "input a netmask:" netmask
for i in {1..4}; do
    net = `echo $ ip | cut -d. -f $ i`
    mask = `echo $ netmask | cut -d. -f $ i`
    subnetid = $ [net & mask]
    if [$ i -eq 1]; then
        netid = $ subnetid
    else
        netid = $ netid. $ subnetid
    fi
done
echo netid = $ netid

Other references:
[[email protected] 9_2] #cat netid1.sh
#! / bin / bash
read -p "input a ip:" ip
read -p "input a netmask:" netmask
for ((i = 1; i <5; i ++)); do
    ip1 = `echo $ ip | cut -d. -f $ i`
    netmask1 = `echo $ netmask | cut -d. -f $ i`
    echo -n $ [$ ip1 & $ netmask1] ## Use -n to append without newline
    if [$ i -eq 4]; then ## Each time a network id field is output and a dot is output, then append
        echo ""
    else
        echo -n "."
    fi
done
[[email protected] 9_2] #
7. Exercise: Enter the number of rows and columns in an interactive way and print out a rectangle?

[[email protected] 9_2] #cat rectangle.sh
#! / bin / bash
read -p "input line number:" x
read -p "input colume number:" y
for row in `seq $ x`; do ## Print multiple lines with specified number of lines
    for col in `seq $ y`; do ## print a line by specifying the number of columns
        echo -e "* \ c"
    done
    echo ## Line break after printing each line
done

Optimized version: add color display and flash
[[email protected] 9_2] #cat rectangle.sh
#! / bin / bash
read -p "input line number:" x
read -p "input colume number:" y
for row in `seq $ x`; do ## Print multiple lines with specified number of lines
    for col in `seq $ y`; do ## print a line by specifying the number of columns
        color = $ [RANDOM% 7 + 31] ## RANDOM% 7 means 0-6, +31 is 31-37
        echo -e "\ 033 [1; 5; $ {color} m * \ 033 [0m \ c" ## 1 highlights, 5 flashes, \ c goes to the end of the line means no line break
    done
    echo ## Line break after printing each line
done
[[email protected] 9_2] #
8. Exercise: Printing an isosceles triangle
Use the second syntax of for
[[email protected] 9_4] #cat fortriangle.sh
#! / bin / bash
read -p "Please input a line number:" line
for ((i = 1; i <= line; i ++)); do
    for ((j = 1; j <= $ [line-i]; j ++)); do
        echo -n ""
    done
    for ((k = 1; k <= $ [2 * i-1]; k ++)); do
        echo -n "*"
    done
    echo
done
9. Print the nine nine multiplication table
method 1:

[[email protected] 9_4] #vim multi.sh
#! / bin / bash
for i in {1..9}; do ## The outer loop determines how many lines to play, i is equivalent to the line number
        for j in `seq $ i`; do ## j means how many times does one line loop?
                echo -e "$ j * $ i = $ (($ j * $ i)) \ t \ c" ## Calculate the results of $ j * $ i, separated by tabs, without line breaks;
        done
        echo ## The position of echo means to wrap after printing a line;
done

[[email protected] 9_4] #sh multi.sh
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
Idea: To find the pattern, the first number is the column number and the second number is the line number;
Print one line first, and then print multiple lines in a loop. When printing a line, how many times do you need to calculate the loop? —————— Finally found that the line number determines the number of cycles

Method 2: C language style

[[email protected] 9_4] #cat for_mult.sh
#! / bin / bash
for ((i = 1; i <= 9; i ++)); do
    for ((j = 1; j <= i; j ++)); do
        echo -e "$ j * $ i = $ [j * i] \ t \ c"
    done
    echo
done
10. Create 10 html files in the / testdir directory, the file name format is number N (from 1 to 10) plus 8 random letters, such as: 1AbCdeFgH.html
[[email protected] 9_4] #vim create.sh
#! / bin / bash
for i in {1..10}; do
        touch $ i`tr -dc "0-9a-zA-Z" </ dev / urandom | head -c8`
done
Fourth, the while loop of the loop
[[email protected] 9_4] #vim while.sh
#! / bin / bash
sum = 0
i = 1
while [$ i -le 100]; do
        let sum + = i
        let i ++
done
echo sum = $ sum "while.sh" [New] 8L, 86C written
[[email protected] 9_4] #sh while.sh
sum = 5050
2. Exercise: Nine Nine Multiplication Table
 9_4] #vim whilemult.sh
#! / bin / bash
i = 1
while [$ i -le 9]; do
        j = 1
        while [$ j -le $ i]; do
        echo -e "$ j * $ i = $ [$ j * $ i] \ t \ c"
        let j ++
        done
        echo
        let i ++
done

[[email protected] 9_4] #sh whilemult.sh
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 =
3. Exercise: Printing an isosceles triangle
[email protected] 9_4] #cat while_triangle.sh
#! / bin / bash
read -p "Please input a line number:" line
i = 1 ## Print multiple lines
while ["$ i" -le "$ line"]; do
    ## print space ## Print space
    j = 1
    while ["$ j" -le $ [line-i]]; do
        echo -n "" ## Or use echo -e "\ c"
        let j ++
    done
    ## print * ## Print * the number of
    k = 1
    while ["$ k" -le $ [2 * i-1]]; do
        echo -n "*"
        let k ++
    done
    let i ++
    echo
done

[[email protected] 9_4] #sh while_triangle.sh
Please input a line number: 10
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************
Idea: first print out the space —————— then print the number of *
Define the total number of lines: line
Current line: i
Current column: j

Middle column = total number of lines
The number of the current line from the beginning to the middle = i
space = line-i
Number of current lines = 2i-1

4. Exercise: Monitor the status of httpd service?
#! / bin / bash
SLEEPTIME = 10
while:; do ##: Both true and true
        if killall -0 httpd &> / dev / null; then ## kill -0 indicates whether the monitoring process is running
                true
        else
                service httpd restart
                echo "At` date + ‘% F% T’` httpd restart" >> /var/log/checkhttpd.log
        fi
        sleep $ SLEEPTIME ## wait time
done

## It is recommended to use nohup script & put it in the background for execution, the terminal exit will not affect the execution.
5. Exercise: Write a script, use the variable RANDOM to generate 10 random numbers, output the 10 numbers, and display the maximum and minimum values
[[email protected] 9_4] #cat formaxmin.sh
#! / bin / bash
echo -e "random list: \ c"
for ((i = 0; i <10; i ++)); do
    rand = $ RANDOM
    echo -e "$ rand \ c"
    if [$ i -eq 0]; then ## The first random number has no comparable number, so it is both the maximum and minimum;
        max = $ rand
        min = $ rand
    fi
    if [$ max -lt $ rand]; then ## If the random number is greater than the maximum value, replace rand with the maximum value;
        max = $ rand
    elif [$ min -gt $ rand]; then ## Otherwise, it is false, that is, the random number is <max, and <min, then it is replaced with the minimum value.
        min = $ rand
    else
        true ## If it is other conditions, the default
    fi
done
echo
echo max is $ max
echo min is $ min

effect:
[[email protected] 9_4] #sh formaxmin.sh
random list: 18428 5303 6933 16210 2577 4107 23750 16836 3435 14399
max is 23750
min is 2577
Five, the loop of the loop
Note: true, exit
Is false, execute the loop statement

1. Exercise: Check the system login user, if there is a hacker login user, kick out?
[[email protected] 9_4] #cat untiltest.sh
#! / bin / bash
until who | grep -q "^ hacker \>"; do
    sleep 3
done
## If a hacker user is logging in, log out of the script and execute the following pkill statement.
pkill -9 -U hacker ## Note that pkill -9 can kill all processes of the user.

## Optimized version: Do not exit the script, enter an endless loop, once the hacker logs in, he will directly kick out
[[email protected] 9_4] #cat untiltest.sh
#! / bin / bash
until false; do ## If false, enter an endless loop
    who | grep -q "^ hacker \>" && pkill -9 -U hacker
    sleep 3
done
Other small exercises 1. Exercise: Randomly generate numbers within 10 to realize word guessing games. Prompt to be larger or smaller, exit if equal
#! / bin / bash
rand = $ [RANDOM% 11] ## Generate random numbers 0-10
while read -p "input a number:" num; do
        if [[! $ num = ~ ^ [0-9] + $]]; then ## Due to direct comparison, not
If it is a number, an error will be reported, so make a judgment;
                echo "Please input a digit"
                continue ## End this loop
        elif [$ num -gt $ rand]; then
                echo $ num is greater
        elif [$ num -lt $ rand]; then
                echo $ num is little
        else
                echo "guess OK"
                break ## Exit the entire loop
        fi
done
2. Exercise: Read the df information line by line, and then judge whether the utilization rate of the partition is greater than 8, and prompt if it is greater
method 1:

[[email protected] 9_4] #cat diskcheck.sh
#! / bin / bash

df | sed -n "/ sd / p" | while read line; do
    name = `echo $ line | tr -s" "% | cut -d% -f1` ## Process each line read by echo $ line
    used = `echo $ line | tr -s" "% | cut -d% -f5`
    if [$ used -gt 8]; then
        echo "$ name will be full; $ used%"
    fi
done

[[email protected] 9_4] #sh diskcheck.sh
/ dev / sda2 will be full; 9%
/ dev / sda1 will be full; 16%
Method 2:

#! / bin / bash
df | while read line; do
    if [["$ line" = ~ /dev/sd.*]]; then
        used = `echo $ line | tr -s" "% | cut -d% -f5`

        if [$ used -gt 8]; then
            echo "$ line" | tr -s "": | cut -d: -f1,5
        fi
    fi
done

[[email protected] 9_4] #sh diskcheck1.sh
/ dev / sda2: 9%
/ dev / sda1: 16%
3. Exercise: Scan each line of the / etc / passwd file. If the GECOS field is found to be empty, fill in the user name and unit phone number 62985600, and prompt that the user's GECOS information was modified successfully
[[email protected] 9_4] #cat user.sh
#! / bin / bash
while read line; do
    GECOS = `echo $ line | cut -d: -f5`
    USER = `echo $ line | cut -d: -f1`
    [-z "$ GECOS"] && chfn -f $ USER -p 2985600 $ USER &> / dev / null;
done </ etc / passwd
4. Exercise: ss -nt to view the IP of the access connection. If it reaches two, set the firewall policy to refuse the connection.
[[email protected] 9_4] #vim test.sh
#! / bin / bash
ss -nt | sed -nr '/ESTAB/s/.* (. *):. * / \ 1 / p' | sort | uniq -c | while read line; do ## Take out the ip and count the times, then Line reading
IP = `echo $ line | cut -d" "-f2`
num = `echo $ line | cut -d" "-f1`
        if ["$ num" -ge 2]; then
                                                iptables -A INPUT -s $ IP -j REJECT ## If the number of connections is> 2, use firewall policy to block the connection
        else
                true
        fi
done
5.select menu
Syntax: select: select NAME [in WORDS ...;] do COMMANDS; done

[[email protected] ~] #cat select.sh
#! / bin / bash
PS3 = "please choose a digit:" ## PS3 is specifically used to provide input
select MENU in jiaozi lamian mifan daoxiaomian quit; do ## in the parameters behind the default one by one according to the serial number 1 2 3 4
    case $ MENU in
    jiaozi)
        echo "Your choose is $ REPLY" ## Variable REPLY is specially used to store the result of user input
        echo "$ MENU price is 20"
    ;;
    lamian)
        echo "Your choose is $ REPLY"
        echo "$ MENU price is 15"
    ;;
    mifan)
        echo "Your choose is $ REPLY"
        echo "$ MENU price is 18"
    ;;
    daoxiaomian)
        echo "Your choose is $ REPLY"
        echo "$ MENU price is 12"
    ;;
    quit)
        echo "Your choose is $ REPLY"
        break
    ;;
    *)
        echo "Your choose is $ REPLY"
        echo "choose again"
    ;;
    esac
done

effect:
[[email protected] ~] #sh select.sh
1) jiaozi
2) lamian
3) mifan
4) daoxiaomian
5) quit
please choose a digit: 1
Your choose is 1
jiaozi price is 20
please choose a digit: 2
Your choose is 2
lamian price is 15
please choose a digit: 5
Your choose is 5
shell script exercise




Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.