是否可以在bash脚本中更改它的内容并在其运行时?

时间:2017-08-04 03:21:24

标签: linux windows bash shell

简短版本 是否可以在bash脚本中更改它的内容并在其运行时?

长版: 我有一个bash脚本,我想从CRLF更改它的EOL' \ r \ n' LF' \ n'它正在运行。目前,我能够做到的目的是将这一行放在脚本之上:

public ActionResult PublicGrid()
    {
        ViewBag.members = db.Members.Count().ToString();

        var members = db.Members.ToList();

        return View(members.OrderBy(a => NumberOnly((a.Batch))).ThenBy(a=> a.LastName).ToList());

    }

    public static int NumberOnly(string strRaw)
    {

        string numbers = string.Empty;

        foreach (char c in strRaw)
        {

            if (Char.IsNumber(c))
            {
                numbers += c;
            }
        }

        return Int32.Parse(numbers);
    }
但是,这肯定是不切实际的。

我在考虑当脚本在第一行运行时,它会创建一个子shell并将当前shell的内容放在那里,进行一些更改并将其放回上层shell中。 这有可能吗?

做同样的想法,但要在新的临时脚本中创建当前脚本的副本:

sed -i -e "s/\r$//g; s/^sed -i -e/#sed -i -e/g" $(basename $0); echo "Rerun again.." ; exit 0;

然后主脚本将执行temp.sh,在脚本完成后,它会将temp.sh的副本捕获回主脚本并删除temp.sh. 我认为这在理论上有效,但我确信有一些更简单的方法。

  

注意:这不是关于EOL,特别是我有一些脚本   需要应用相同的功能。

使用示例: 该项目涉及在Windows和Linux上运行脚本,如果有任何用户在Windows上通过编辑器打开脚本,它会将EOL保存为Windows格式,这是' \ n \ r'这将导致此错误窗口:

cat $0 > temp.sh

这就是我在剧本开头使用sed的原因。

2 个答案:

答案 0 :(得分:0)

请勿更改当前正在运行的脚本。

一旦我有一个非常慢的脚本并且在执行期间我开始调整它以准备下一次执行。它开始表现得非常奇怪。在我看来,bash只读取脚本的开头并稍后读取其他部分。因此,当我的脚本很短时,开始时不是问题,但随着我的脚本变得更长,它开始引起问题。

答案 1 :(得分:0)

您可以延长当前的尝试次数:

[[ -z "$CANARY" ]] && { sed -i -e 's/\r$//g' "${BASH_SOURCE[0]}"; CANARY=1 exec "${BASH_SOURCE[0]}"; }

基本上,您测试某个变量,进行修改,然后在设置变量时使用修改后的源重新执行。

你也可以source而不是exec,而不是修改实际的脚本文件:

[[ -z "$CANARY" ]] && { CANARY=1 source <(sed 's/\r$//g' "${BASH_SOURCE[0]}"); exit }