Tyler Chris - Fedora Linux стр 50.

Шрифт
Фон

mkdir backup

for FILE in /etc/*.conf

do

echo "Backing up the file $FILE..."

cp $FILE backup/

done

For the if and while control structures, a control-command determines the action taken. The control-command can be any command on the system; an exit status of zero is considered TRue and any other exit status is considered false .

For example, the grep command exits with a value of zero if a given pattern is found in the file(s) specified or in the standard input. When combined with an if structure, you can cause a program to take a particular action if a pattern is found. For example, this code displays the message "Helen is logged in!" if the output of who contains the word helen :

if who | grep -q helen

then

echo "Helen is logged in!"

fi

The exit status of the last command is taken as the exit status of a pipeline, which is grep in this case. The -q argument to grep suppresses the outputotherwise, matching lines are sent to standard output.

test

Table 4-19. Common bash conditional operators

OperatorTests whether...Example using an environment variable
-f file File exists and is a regular file-f "$A"
-d file File exists and is a directory-d "$B"
-r file File exists and is readable-r "$C"
-w file File exists and is writable-w "$D"
-x file File exists and is executable-x "$E"
value1 == value2 Strings match"$F" == "red"
value1 != value2 Strings don't match"$G" != "blue"
value1 -eq value2 Integer values are equal"$H" -eq 2
value1 -ne value2 Integer values are unequal"$J" -ne 10
value1 -gt value2 value1 integer value is greater than value2 "$K" -gt 25
value1 -ge value2 value1 integer value is greater than or equal to value2 "$L" -ge 25
value1 -lt value2 value1 integer value is less than value2 "$M" -lt 75
value1 -le value2 value1 integer value is less than or equal to value2 "$N" -le 75
expression1 -a expression2 expression1 and expression2 are both true"$P" -gt 36 -a "$P" -lt 71
expression1 -o expression2 expression1 or expression2 (or both) are true"$P" -lt 12 -o "$P" -eq 50

So if you wanted to print "Too high!" if the value of the variable A was over 50, you would write:

if test "$A" -gt 50

then

echo "Too high!"

fi

The variable expression $A is quoted in case A has a null value ("") or doesn't existin which case, if unquoted, a syntax error would occur because there would be nothing to the left of -gt .

The square brackets ( [] ) are a synonym for test , so the previous code is more commonly written:

if [ "$A" -gt 50 ]

then

echo "Too high!"

fi

You can also use test with the while control structure. This loop monitors the number of users logged in, checking every 15 seconds until the number of users is equal to or greater than 100, when the loop will exit and the following pipeline will send an email to the email alias alert :

while [ "$(who | wc -l)" -lt 100 ]

do

sleep 15

done

echo "Over 100 users are now logged in!"|mail -s "Overload!" alert

4.12.1.4. Integer arithmetic

bash

Inside double parentheses, you can read a variable's value without using the dollar sign (use A=B+C instead of A=$B+$C).

A=0

while [ "$A" -lt 20 ]

do

(( A=A+1 ))

echo $A

done

The C-style increment operators are available, so this code could be rewritten as:

A=0

while [ "$A" -lt 20 ]

do

echo $(( ++A ))

done

The expression $(( ++A )) returns the value of A after it is incremented. You could also use $(( A++ )) , which returns the value of A before it is incremented:

A=1

while [ "$A" -le 20 ]

do

echo $(( A++ ))

done

Since loops that count through a range of numbers are often needed, bash also supports the C-style for loop. Inside double parentheses, specify an initial expression, a conditional expression, and a per-loop expression, separated by semicolons:

# Initial value of A is 1

# Keep looping as long as A<=20

# Each time you loop, increment A by 1

for ((A=1; A<=20; A++))

do

echo $A

done

Note that the conditional expression uses normal comparison symbols ( <= ) instead of the alphabetic options ( -le ) used by test .

Don't confuse the C-style for loop with the for...in loop!

4.12.1.5. Making your scripts available to users of other shells

bash tcsh

To make your scripts more robust, add a shebang line at the beginning a pound-sign character followed by an exclamation mark, followed by the full path of the shell to be used to interpret the script ( /bin/bash ):

#!/bin/bash

# script to count from 1 to 20

for ((A=1; A<=20; A++))

do

echo $A

done

I also added a comment line (starting with # ) after the shebang line to describe the function of the script.

The shebang line gets its name from sharp and bang , common nicknames for the #! characters.

4.12.1.6. An example

bash

#!/bin/bash

#

# number-guessing game

#

# If the user entered an argument on the command

# line, use it as the upper limit of the number

# range.

if [ "$#" -eq 1 ]

then

MAX=$1

else

MAX=100

fi

# Set up other variables

SECRET=$(( (RANDOM % MAX) + 1 )) # Random number 1-100

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке