如果我传递一个文件作为位置参数,当我把它放在变量中时bash会抱怨

时间:2014-04-24 00:07:53

标签: bash

这非常奇怪:我有一个函数,它接受一个文件路径,读取最后一行并返回值。

现在,我想从另一个脚本调用此函数;所以我只是将路径传递给文件,并在函数中获得$ 1,所以我可以使用它。

但似乎出于某种原因,bash不喜欢我给变量分配$ 1的想法。

printval(){

textfile=$1

result=$(tail -n 1 $textfile)
echo $result

当我调用该函数时:

printval "/User/admin/test.txt"

现在,无论我如何传递文件路径(我可以通过变量或仅作为字符串传递它),无论我在函数中使用$ 1,还是我明确键入文件的路径,结果是我得到一个错误,说'#34;权限被拒绝。

奇怪的是,如果我在函数

printval(){

result=$(tail -n 1 "/User/admin/test.txt")
echo $result

我没有收到任何错误,并且文件读取正确。

我做错了什么?我只是想将一个文件的路径传递给函数,所以我可以在函数中使用该文件的内容。

2 个答案:

答案 0 :(得分:3)

您使用的实际文件是否在其文件名中有空格?也就是说,你实际输入的是这样的东西:

printval "/User/j doe/test.txt"

你应该用防御性引用来编写你的函数:

printval(){
  textfile=$1
  result=$(tail -n 1 "$textfile")
  echo "$result"
}

引用不参数传递。您可以使用textfile/User/j doe/test.txt设置为textfile=$1,但是当您使用它时,bash会将tail -n 1 $textfile扩展为tail -n 1 /User/j doe/test.txt,其中引用了两个可能不在的文件存在。您需要引用$textfile来避免使用tail -n 1 "$textfile")。

答案 1 :(得分:-2)

改为打电话

printval /User/admin/test.txt

否则失败(我不确定它正在寻找的文件是“/User/admin/test.txt”,我想不是,但它失败了)

将其放在.sh文件

#!/bin/bash

printval(){

textfile=$1

result=$(tail -n 1 "$textfile")
echo $result
}

printval ~/.bashrc

自己尝试一下。如果不使用最后一行,则使用

printval "~/.bashrc"

如你在帖子中所说,它会抱怨。