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


9

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

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

./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

Answers:


17

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


5

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

在这种情况下,使用小写字母可能会解决您的问题,因为仅保留大写字母的变体,但是您也可以通过调用变量(例如$ input_uid)来使变量唯一,因此很明显值来自脚本的输入。从长远来看,这将使您的代码更易于维护。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.