在shell脚本中将变量的值作为命令行参数传给程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在shell脚本中将变量的值作为命令行参数传给程序相关的知识,希望对你有一定的参考价值。

编写一个脚本,在其中调用一个函数,把一个变量的值作为参数传递给该函数?
坐等回答谢谢!

fun()
echo "$1"

fun "abc"
$1就代表了你传进去的第一个参数,$2当然就是第二个参数,fun就是你定义的函数名,后面的“abc”就是实参,即你说的变量,运行之后就会显示abc
参考技术A #!/bin/sh
myFunc()

echo "$1"

var="$1"
myFunc "$var"

---------------
脚本名为test.sh,执行脚本 ./test.sh test
最后就会在屏幕上打印出字符串 test

说明:脚本主体中用$1取脚本的第一个参数,函数中用$1取函数的第一个参数。第二个参数用$2。依此类推,直到$9。追问

谢谢,能工作,但有一点问题。我的脚本如下
node[3]=‘3 -1 -0.9 -0.92 -0.88’
node[4]=
.
.
.
for(( a=5 ; a<=15 ; a++))
do
./excute_cut.exp "$node[$a]"

done
用数组node[]存储参数传给expect脚本,expect登录不同节点,用不同参数执行程序。节点名为node[]中的第一个数后面的是程序参数。但这个脚本把node[]中的所有字符都当作第一个参数了。怎么才能使数组中的space起到分隔符的作用呢?

追答

你都包含在双引号中了,那就是作为一个整体参数来传参了。
去掉双引号试试:
./excute_cut.exp $node[$a]

本回答被提问者采纳

shell脚本基础知识

1.常见的shell内置变量有哪些?

变 量含义
$0 脚本名字
$1 位置参数 #1
$2 - $9 位置参数 #2 - #9
${10} 位置参数 #10
$# 位置参数的个数
"$*" 所有的位置参数(作为单个字符串) (必须被引用起来, 否则默认为"$@")
"$@" 所有的位置参数(每个都作为独立的字符串)
${#*} 传递到脚本中的命令行参数的个数
${#@} 传递到脚本中的命令行参数的个数
$? 上一条命令返回值(0表示成功,可以echo输出查看)
$$ 脚本运行的当前进程ID(PID)
$- 传递到脚本中的标志(使用set)
$_ 之前命令的最后一个参数
$! 运行在后台的最后一个作业的进程ID(PID)

 

2.如何向脚本传递并使用参数 ?

./script argument1 argument2 argument3

在脚本中,$1引用第一个参数,$2引用第二个参数,依次类推;

$#可以计算向脚本传递的参数个数;

$*和$@都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数;

"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@"和$@输出结果一致

脚本test.sh内容如下

#!/bin/bash
echo \'$*输出如下:\'
for var in $*
do
echo "$var"
done
echo \'"$*"输出如下:\'
for var in "$*"
do
echo "$var"
done
echo \'$@输出如下:\'
for var in $@
do
echo "$var"
done
echo \'"$@"输出如下:\'
for var in "$@"
do
echo "$var"
done

 

传递参数执行: ./test.sh va1 va2 va3 ,输出结果如下:

$*输出如下:
va1
va2
va3
va4
"$*"输出如下:
va1 va2 va3 va4
$@输出如下:
va1
va2
va3
va4
"$@"输出如下:
va1
va2
va3
va4

3.文件类型的测试操作有哪些?

操作测试条件操作测试条件
-e 文件是否存在 -s 文件大小不为0
-f 是一个标准文件    
-d 是一个目录 -r 文件具有权限
-h 文件是一个符号链接 -w 文件具有权限
-L 文件是一个符号链接 -x 文件具有执行权限
-b 文件是一个块设备    
-c 文件是一个字符设备 -g 设置了sgid标记
-p 文件是一个管道 -u 设置了suid标记
-S 文件是一个socket -k 设置了"粘贴位"
-t 文件与一个终端相关联    
-N 从这个文件最后一次被读取之后, 它被修改过 F1 -nt F2 文件F1比文件F2 *
-O 这个文件的宿主是你 F1 -ot F2 文件F1比文件F2 *
-G 文件的组id与你所属的组相同 F1 -ef F2 文件F1和文件F2都是同一个文件的硬链接 *
! "非" (反转上边的测试结果)    

4.如何获取一个文件指定行列(第x行第y列)的内容?

awk \'NR=x{print $y}\' filename

更多awk相关可以参考awk命令入门 - 博客园 (cnblogs.com)

5.如何在后台运行脚本或命令?

nohup command&

6.shell中单引号、双引号、反引号有什么区别?

\'(单引号):会原样输出单引号内所有内容;即使单引号里使用了变量等也不会进行解析;

"(双引号):会把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,再输出最终内容来;

`(反引号):一般用于命令,执行的时候会获取命令结果,相当于$()。

7.shell脚本中变量自增(i=i+1)的写法?

一般写在循环内配合条件来自增:

①  i=$(( $i + 1 ))

②  i=$[$i+1]

③  ((i++))

④  let i+=1

⑤  i=`expr $i + 1`

8.shell脚本中有哪些循环?

①for循环:

 for i in list
  do
   command...
  done

list可以理解为一个数组,可以是命令返回的结果等;也可以是自定义的如 1 2 3 4 5等等;

②while循环:

 while [ condition ]
  do
   command...
 done

③until循环:

until是条件不满足就一直执行循环体代码块内的指令,条件满足就会退出开始执行后面的命令

 until 循环条件
    do
      command...
    done

eg1:监控用户是否登录,如果用户登录则杀死对应进程并结束

 until pgrep -u user1 &> /dev/null;do
 
    sleep 1
 
 done
 
 pkill -9 -u user1

eg2:使变量递增直到其值大于10

 val=0;
 until ((val>10))
 do
     let val+=1;
 done
 echo $val

④select循环:

select variable in list
do
  循环体命令
done

1.select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入;

2.用户输入菜单列表中的某个数字,执行相应的命令

3.用户输入被保存在内置变量 REPLY 中

4.select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 按 命令终止脚本。也可以按 ctrl+c退出循环

5.select 和 经常和 case 联合使用

6.与for循环类似,可以省略 in list, 此时使用位置参量

eg:

PS3="请输入你需要选择的菜单序号:"

select menu in 米饭 包子 饺子 面条 quit;do

   case $REPLY in

   1|2)

      echo "你选择的是米饭或包子,价格为3元每份。"

;;

   3|4)

      echo "你选择的是饺子或面条,价格为10元每份。"

;;

   5)

      break

;;

   *)

      echo "没有这个选项,请重新选择!!!"

   esac

done

更多参考:shell中四大循环介绍及使用_-CSDN博客

9.shell中如何获取变量长度以及如何截取变量?

假定var为变量:

${#var}可以获取变量长度

截取变量的方法:

① ${var:x:y} 表示从左边第x个字符开始,截取y个字符(ps:这里左边起始位置是从0开始);

  如执行var=123456789 && echo ${var:2:3}  输出结果为345

② ${var:x}   表示从左边第x个字符开始,一直到结束;

  如执行var=123456789 && echo ${var:2}  输出结果为3456789

③ ${var#*//}  其中 # 是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符;

  如执行var=http://www.name.com/test.html && echo ${var#*//}  输出结果为   www.name.com/test.html

④ ${var##*/}  表示从左边开始删除最后(最右边)一个 / 及左边的所有字符;

  如执行var=http://www.name.com/test.html && echo ${var##*/}  输出结果为  test.html

⑤ ${var%/*}  表示从右边开始,删除第一个 / 号及右边的字符;

  如执行var=http://www.name.com/test.html && echo ${var%/*}  输出结果为  http://www.name.com

${var%%/*} 使用%%截取(删除右边字符,保留左边字符);表示从右边开始,删除最后(最左边)一个 / 号及右边的字符;

  如执行var=http://www.name.com/test.html && echo ${var%%/*}  输出结果为  http:

${var:0-9:4}  其中的 0-9 表示从右边第9个字符开始,4表示要截取字符的位数(ps:从右边开始的第一个字符用 0-1 表示)

  如执行 var=http://www.name.com/test.html && echo ${var:0-9:4} 输出结果为 test

${var:0-9}  其中的 0-7 表示从右边第9个字符开始,截取右边所有

  var=http://www.name.com/test.html && echo ${var:0-9} 输出结果为 test.html

以上是关于在shell脚本中将变量的值作为命令行参数传给程序的主要内容,如果未能解决你的问题,请参考以下文章

linux中设计一个shell脚本程序可以接受命令行输入的参数执行相应的菜单命令

为 shell 脚本指定命令行参数,例如 name=value 对

shell脚本命令行参数里的空白符

shell脚本基础知识

shell脚本中常用的命令

1. shell 简明教程