【问题标题】:"read $#" fails ("not a valid identifier"). What does this mean?“读取 $#”失败(“不是有效的标识符”)。这是什么意思?
【发布时间】:2017-10-28 12:53:31
【问题描述】:

谁能帮我处理这段代码? bash 无法识别 $2,只有第一个 $1 显示错误:read: '2': it is not a valid identificator

#!/bin/bash
read $#
a=$#

【问题讨论】:

  • 你希望read $#做什么?
  • 这也有很多其他问题 - 它比一个问题可以/应该回答的要大。通过shellcheck.net 运行您的代码并修复它找到的内容。
  • 我已经删减了与狭隘技术问题无关的代码——以前这太宽泛了,无法包含在网站规则中。请参阅有关构建 minimal reproducible example 的文档——一个好的代码示例专注于展示单个特定错误,并删除所有与产生该错误无关或不必要的内容。
  • 我希望 $# 读取我在运行它时编写的所有参数。关于 $qq 或者 $qw 我分别改了 $1 和 $2
  • $# 是命令行参数的数量。 read 的语法是 read ... name,其中“name”是变量的名称。变量名只能以字母或下划线开头,所以#不能直接改变,1或2也不能。注意变量名不能以$开头,前导$是一元运算符,它给出变量的。所以要从标准输入读入变量fred我们read fred,显示它的值我们echo $fred。在命令行上执行help read

标签: bash arguments


【解决方案1】:

你不能读入$#读入名为2的变量($#扩展为)。

相反,要重新分配$2,您需要使用set 来完全重写全套位置参数:

set -- one two

...将$2 设置为two,将$# 设置为2(因为提供了两个项目)。


相比之下,如果您只想使用在脚本命令行中传递的$2 的值,则根本不需要(也不应该)使用read

相比之下,如果你想访问 last 命令行参数,你可以使用间接扩展:

set -- one two last
last_arg=$#          # sets last_arg=3
result=${!last_arg}  # sets result=last

...或者,如果你想用从标准输入读取的值覆盖最后一个命令行参数:

read new_last
set -- "${@:1:$(( $# - 1 ))}" "$new_last"

【讨论】:

  • 我在终端上运行它,它工作正常:./"namescript.sh py($1) sh($2)
  • 是的——如果你传入你的参数,你不需要set -- 覆盖它们。但是,read $# 在任何情况下都不会做任何有用的事情。
  • 感谢您的帮助,但我还有一个问题:如何比较参数之间的值?
  • 你的意思是像if [ "$1" = "$2" ]; then echo "Both arguments are the same"; fi? (通常,第二个问题应该作为一个单独的问题提出,但我很乐意至少帮助缩小该问题的范围)。
  • 这更像是 if [ "$du -hc $1" -lt "$du -hc $2" ];然后 echo "$1 小于 $2";fi
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多