Bash 脚本错误:./test:第 5 行:UID:只读变量

hfr*_*nco 10 scripting bash

我有一个脚本可以在我的开发服务器上正常工作,但是当我尝试在生产中运行它时不起作用。

我收到以下错误,我无法弄清楚:

./test.sh:第 5 行:UID:只读变量

有什么建议?

#!/bin/sh

    while read inputline
    do
     UID="$(echo $inputline | cut -d '"' -f4)"
     PASSWORD="$(echo $inputline | cut -d '"' -f8)"
     FIRST="$(echo $inputline | cut -d '"' -f6 | cut -d ' ' -f1)"
     LAST="$(echo $inputline | cut -d '"' -f6 | cut -d ' ' -f2)"    

    zmprov createAccount $UID $PASSWORD displayName "$FIRST $LAST" givenName $FIRST sn $LAST    

    done < company.csv
Run Code Online (Sandbox Code Playgroud)

gee*_*aur 19

在 shell 脚本中使用小写变量是个好主意,因为大写变量通常是为 shell 内部保留的。(环境变量是一个例外,但实际上应该以相同的方式对待,因为具有特殊含义的事物不应在不了解自己在做什么的情况下随意更改。)在这种情况下,bash将其设置$UID为正在运行的 Unix uid下,并且不允许更改它或将变量用于其他任何事情。除了bashsh可能是dash或某些平台上的其他一些 shell)之外的 shell 可能不会使用$UID这种方式,如果bash被构建为在调用时在 Bourne shell 兼容模式下工作sh(这是默认值,但许多 Linux 发行版禁用了它)它不会'治疗$UID 也很特别。


Cal*_*leb 5

UID是一个系统保留变量,其中包含有关您的脚本正在运行的用户 ID 的信息。您应该注意不要使用系统可能正在使用的标准变量名称。您可以使用env来获取当前设置的列表。不要改变任何一个。在继续使用变量名称之前,您还可以在 google 变量名称中查看它们是否出现在其他用户中。

在这种情况下,使用小写可能会解决您的问题,因为只保留了大写变体,但您也可以通过调用诸如 $input_uid 之类的东西来使变量唯一,因此很明显值来自脚本的输入。从长远来看,这将使您的代码更容易维护。