编写一个在bash / shell 和 PowerShell中均可运行的脚本

5 篇文章 1 订阅

任务:创建一个集成脚本来设置一些环境变量, 使用 wget 下载文件并运行它.

挑战在于它需要是可以在 Windows PowerShell 和 bash / shell 上运行的 SAME 脚本.

这是 shell 脚本:

#!/bin/bash
# download a script
wget http://www.example.org/my.script -O my.script
# set a couple of environment variables
export script_source=http://www.example.org
export some_value=floob
# Now execute the downloaded script
bash ./my.script

这与 PowerShell 中的情况相同:

wget http://www.example.org/my.script -O my.script.ps1
$env:script_source="http://www.example.org"
$env:some_value="floob"
PowerShell -file ./my.script.ps1

所以我想知道这两个脚本是否可以合并并在任一平台上成功运行?

我一直在试图找到一种方法将它们放在同一个脚本中, 并让 bash 和 PowerShell.exe 忽略错误, 但没有成功.

我不知道这是多么兼容, 但 PowerShell 将字符串视为文本并最终显示在屏幕上, Bash 将它们视为命令并尝试运行它们, 并且两者都支持相同的函数定义语法. 因此, 将函数名称放在引号中, 只有 Bash 会运行它, 将 “exit” 放在引号中, 只有 Bash 才会退出. 然后编写 PowerShell 代码.

NB. 这是有效的, 因为两个 shell 中的语法重叠, 并且您的脚本很简单 – 运行命令并处理变量. 如果您尝试使用更高级的脚本 (if / then,for,switch,case 等) 用于任何一种语言, 另一种可能会抱怨.

将其保存为 dual.ps1, 以便 PowerShell 对它感到满意, chmod x dual.ps1 因此 Bash 将运行它

#!/bin/bash
 
function dobashThings {
    wget http://www.example.org/my.script -O my.script
    # set a couple of environment variables
    export script_source=http://www.example.org
    export some_value=floob
    # Now execute the downloaded script
    bash ./my.script
}
 
"dobashThings"  # This runs the bash script,in PS it's just a string
"exit"          # This quits the bash version,in PS it's just a string
 
 
# PowerShell code here
# --------------------
Invoke-WebRequest "http://www.example.org/my.script.ps1" -Outfile my.script.ps1
$env:script_source="http://www.example.org"
$env:some_value="floob"
PowerShell -file ./my.script.ps1

然后

./dual.ps1

在任何一个系统上编辑:您可以通过使用不同的前缀注释代码块来包含更复杂的代码, 然后让每种语言过滤掉自己的代码并对其进行评估 (通常的安全警告适用于 eval), 例如:采用这种方法 (纳入 Harry Johnston 的建议):

#!/bin/bash
 
#posh $num = 200
#posh if (150 -lt $num) {
#posh   write-host "PowerShell here"
#posh }
 
#bash thing="xyz"
#bash if [ "$thing" = "xyz" ]
#bash then
#bash echo "Bash here"
#bash fi
 
function RunBashStuff {
    eval "$(grep '^#bash' $0 | sed -e 's/^#bash //')"
}
 
"RunBashStuff"
"exit"
 
((Get-Content $MyInvocation.MyCommand.source) -match '^#posh' -replace '^#posh ') -join "`n" | Invoke-Expression
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值