操作系统shell按行读入文件,shell脚本常用方法总结

echo “while read line <file” 

 
[[email protected]]$
cat file.txt 

cat test.txt |while read line 

  1. #/bin/bash  
    1. printf
      “*************************************\n”  
  2. echo ” cat file whiel read line”  
  3. cat test.txt |while read line  
  4. do  
  5.   echo $line;  
  6. done  
    1. printf
      “*************************************\n”  
  7. echo “while read line <file”  
  8. while read line  
  9. do  
  10.   echo $line;  
  11. done <test.txt
    1. printf
      “*************************************\n”  
  12. echo “for line in cat test.txt”  
  13. SAVEIFS=$IFS  
  14. IFS=$(echo -en “\n”)  
  15. for line in $(cat test.txt)  
  16. do  
  17.   echo  $line;  
  18. done  
  19. IFS=$SAVEIFS 

  for line in `cat file.txt`

for line in $(cat test.txt) 

注意:for line in $(cat test.txt)   当文件中有空格或者tab
时,一定要设置一下IFS变量。

  #sh test.sh a b c d

 

  done

linux shell按行读入文件

 

done 

  /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

#/bin/bash 

  do

printf
“*************************************\n” 

${变量#关键字}
若变量内容从头开始的资料符合‘关键字’,则将符合的最短资料删除

printf
“*************************************\n” 

        <== 因为 test_name
被设定为空字符窜!所以当然还是保留为空字符窜!

 

  ssssss

  echo $line; 

系统管理中bash shell脚本常用方法总结

printf
“*************************************\n” 

num1 -le num2
num1小于等于num2为真

IFS=$(echo -en “\n”) 

  echo ‘”$*” output ….’

do 

  num=`wc -l work.txt`

do 

  root  <==
加上‘:’后若变量内容为空或者是未设定,都能够以后面的内容替换!

while read line 

使用for循环来读取文件

SAVEIFS=$IFS 

在看一个复杂一点的例子,将文件内容读取到数组中:

echo “for line in cat test.txt” 

  echo

  echo $line; 

请看测试例子

done <test.txt 

  done

do 

${变量##关键字}
若变量内容从头开始的资料符合‘关键字’,则将符合的最长资料删除

  echo  $line; 

  # 循环显示文件内容

done 

单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符
,不会作变量的引用,直接输出字符窜。请看如下例子:

IFS=$SAVEIFS

举例如下,比较字符串来测试用户ID :

echo ” cat file whiel read line” 

 
[[email protected]
~]# echo $name 

shell按行读入文件 #/bin/bash printf
*************************************\n
echo cat file whiel read line cat test.txt |while read line do nbsp;
echo $line; done printf…

num1 -gt num2
num1大于num2为真

 

举例如下:

 

 

 

在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!

  sssss

-e filename
文件存在返回1, 否则返回0

 

  

 

 
[[email protected]
~]# echo ${test_str#/*kerberos/bin:}

  

  for (( i=0; i<${tLen}; i++ ));

 
[[email protected]
~]# echo $test_name

 

  done

  1. 变量内容的删除与替换

-r filename
文件可读返回1,否则返回0

  do

   

  sdfsdfsdfsdfsdf

  # 设置IFS将分割符 设置为 换行符(\n)

  1. bash shell 脚本中常用隐含变量

 

  if [ $num -gt 150 ];then

使用while循环读取文件

 
[[email protected]
~]# export
test_str=”/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin” 

  #!/bin/sh

如果未设置IFS变量,使用默认的IFS变量值 ,输出结果如下

注意:由于使用while来读入文件里的行时,会整行读入,不会关注行的内容(空格..),所以比for读文件有更好的适用性,推荐使用while循环读取文件

  do

 
[[email protected]
~]# test_name=${test_name:-root}

如果要查看详细的测试操作,可以查看man手册 man test

        echo “$userName -> $homeDir”

  do

举例如下,测试文件是否存在:

  #cat test.sh 

  done

  tLen=${#NAMESERVERS[@]}

num1 -eq num2
两数相等为真

 

  # restore it

变量设定方式
str 未定义
str 为空字串
str 已赋值为非空字串

str1 = str2
当两个字串相等时为真

  do

 
[[email protected]
~]# test_name=${test_name-root}

$0
当前执行的脚本或者命令名称

  ssssss ssssss ssssss sssss

  echo $line

$#
脚本调用的参数的个数

  ssssss

${变量%关键字}
若变量内容从尾向前的资料符合‘关键字’,则将符合的最短资料删除

    echo “${fileArray[$i]}”

-w filename
文件可写返回1,否则返回0

$$ 变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。 

      array[n]=varN

 

 

  fi

计算数组元素个数或者长度:

$!
后台运行的最后一个进程号

 
[[email protected]
~]# name=HaHa 

 

 
[[email protected]
~]# myname=’$name is wow’ 

执行测试程序 输出结果如下(正确输出)

$$
当前运行脚本的进程号

var=${str?expr}
expr 输出至 stderr var= var=$str

 

 

  # 循环数组

字符串比较

从上面例子可以看出,使用了单引号的时候,那么$name只是普通字符,直接输出而已!

操作符
比较结果

      arrya[1]=var2

数值比较(整数)

  do

          echo “You have no permission to run $0 as non-root user.”

${变量%%关键字}
若变量内容从尾向前的资料符合‘关键字’,则将符合的最长资料删除

 

  (2) array=([0]=var1 [1]=var2 [2]=var3 … [n]=varN)

  for i in
“[email protected]”

 
[[email protected]]$
sh test.sh 

  sdfsdfsdfsdfsdf

  tLen=${#fileArray[@]}

  for (( i=0; i<${tLen}; i++ ));

举例如下(删除字符窜中的某个字符):

-o filename
文件属于用户本人返回1, 否则返回0

  1. 逻辑判断 条件测试

var=${str:+expr}
var=
var=
var=expr

  while IFS=: read userName passWord userID groupID geCos homeDir
userShell

  echo -n “Checking…”

-f filename
文件为普通文件返回1, 否则返回0

  echo $line

  1. shell 数组的使用

$*
所有参数的内容

  ssssss ssssss ssssss sssss

  1. 变量条件测试赋值

 

 

我们在一些情况下,需要对变量中的字符窜进行查找删除或者替换,就需要使用下表列出的方法

  echo “checks the existence of the messages file.”

从以上测试程序输出结果,可以根据自己的需求来设定
IFS变量,在举一个例子如下:

  HaHa is wow 

  done < /etc/passwd

  fi

 

  1. 单引号和双引号的区别

  a

 

  # 读取文件内容到数组

  # 得到数组长度

  echo

 

  fi

[email protected] 所有参数的内容

  IFS=$OLDIFS

  if [ “$(whoami)” != ‘root’ ]; then

在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则.

  cat file.txt |while read line

var=${str:=expr}
var=expr
var=expr
var=$str

  echo $line

${变量//旧字串/新字串}
若变量内容符合‘旧字串’则‘全部的旧字串会被新字串取代

从输出结果可以看出 “$*” 输出是一行 而
“[email protected]”
输出则是四行

str
当字符串为非空时为真

  1. 逐行读取文件

  if [ -f /var/log/messages ];then

      echo $i

 

基本上这种变量的测试也能够透过 shell script 内的 if…then…
来处理,不过通过上述提及的简单的方法来测试变量,是程序看起来更精简一些!

 
[[email protected]
~]# myname=”$name is wow” 

在某些时刻我们需要‘判断’某个变量是否存在,若变量存在则将此变量值赋值给新的变量,若变量不存在则将其他值赋值给新的变量.

  done

str1 != str2
当两个字串不等时为真

   

 

  do

 
[[email protected]
~]# test_name=””

$* 和
[email protected]
如果输出是一样的,但是在使用for循环,在使用 双引号(“”)引用时 “$*”
会输出成一个元素 而
“[email protected]”
会按照每个参数是一个元素方式输出

  HaHa 

  ssssss

  done < file.txt

变量设定方式
说明

   

num1 -ne num2
两数不等为真

 
[[email protected]]$
sh test.sh 

  sdfsdfsdfsdf

  echo $line

  for i in “$*”

  done

操作符
测试结果

 

  sdfsdfsdfsdf

  sdfsdfsdfsdfsdf

var=${str=expr}
var=expr
var=
var=$str

  

注意:由于使用for来读入文件里的行时,会自动把空格和换行符作为一样分隔符,如果行里有空格的时候,输出的结果会很乱,所以只适用于行连续不能有空格或者换行符的文件

 

  “$*” output ….

shell脚本常用方法总结
在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!
在编写的…

   

 

  for line in `cat file.txt`

 

  IFS_old=$IFS      #将原IFS值保存,以便用完后恢复

var=${str+expr}
var=
var=expr
var=expr

 

  (3) array[0]=var1

  (1) array=(var1 var2 var3 … varN)

 

$1-$9
代表参数的位置. 举例 $1 代表第一个参数.

var=${str:?expr}
expr 输出至 stderr expr 输出至 stderr var=$str

shell脚本中,如果使用for循环一个字符窜的话,默认使用空格来分割字符窜.还有前面所提到的
使用for循环逐行读取文件内容时候,文件行中如果有空格的话输出的结果也会变乱.这个时候
使用 IFS 变量来设置特定的字符窜分割符来,达到输出正确的目的.默认情况下
IFS 是使用 <space><tab><newline>, 空格 \t \n
来作为默认的分割符的.

操作符
比较结果

  或者:

 

  (2) ${#array[*]}

  #!/bin/bash

          exit 1;

 

-z str1
当字符串的长度为0时为真

$?
命令执行后返回的状态

 
[[email protected]
~]# echo $myname 

  echo “you’ve worked hard enough for today.”

了解了数组基础语法,举例说明,请看:

  do

  OLDIFS=$IFS

  echo “…done.”

num1 -lt num2
num1小于num2为真

 

数组赋值方式:

  while read line

  #!/bin/bash

  fileArray=($(cat file.txt))

 

我们将前面使用for逐行读取文件的例子 改进下就可以输出正确了,请看下面

var=${str-expr}
var=expr
var=
var=$str

  $name is wow  

  c

  b

  IFS=$’\n’ 

  #!/bin/bash

文件属性的判断

${变量/旧字串/新字串}
若变量内容符合‘旧字串’则‘第一个旧字串会被新字串取代

  a b c d

  1. shell 中分隔符 : 变量IFS 使用

      echo “/var/log/messages exists.”

-d filename
文件为目录文件时返回1, 否则返回0

-x filename
文件可执行返回1,否则返回0

注意: $?
用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错) 

 

 
“[email protected]”
output…..

  (1) ${#array[@]}    

-n str1
当字符串的长度大于0时为真

    echo ${NAMESERVERS[$i]}

  echo
‘”[email protected]”
output…..’

      …

  do

 
[[email protected]
~]# echo $myname 

举例如下:

num1 -ge num2
num1大于等于num2为真

-z filename
文件长度为0返回1, 否则返回0

  IFS=$’\n’         #更改IFS值为$’\n’

 
[[email protected]
~]# echo $test_name

file.txt 文件内容如下

输出结果

  done

  d

  echo $i

  sdfsdfsdfsdf

var=${str:-expr}
var=expr
var=expr
var=$str

  #!/bin/bash

  NAMESERVERS=(“ns1.www.net.” “ns2.www.net.” “ns3.www.net.”)