当前位置:网站首页>编写一个在bash / shell 和 PowerShell中均可运行的脚本
编写一个在bash / shell 和 PowerShell中均可运行的脚本
2022-07-26 09:37:00 【Dust_Evc】
任务:创建一个集成脚本来设置一些环境变量, 使用 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
边栏推荐
- 阿里云技术专家郝晨栋:云上可观测能力——问题的发现与定位实践
- Process32First返回false,错误x信息24
- mysql5.7.25主从复制(单向)
- Does volatile rely on the MESI protocol to solve the visibility problem? (top)
- tabbarController的使用
- IIS website configuration
- Wechat applet avatarcropper avatar clipping
- VectorTileLayer更换style
- 学习笔记之常用数组api 改变原数组和不改变原数组的有哪些?
- copyTo
猜你喜欢
随机推荐
JS 一行代码 获取数组最大值与最小值
dll中的全局变量
MQTT X CLI 正式发布:强大易用的 MQTT 5.0 命令行工具
MySQL的逻辑架构
Fiddler packet capturing tool for mobile packet capturing
copyTo
网络流学习笔记
docker配置mysql集群
Table extraction for opencv table recognition (2)
RMQ学习笔记
TableviewCell高度自适应
Neural network and deep learning-6-support vector machine 1-pytorch
Great reward for interview questions
Malloc failed to allocate space and did not return null
js 表格自动循环滚动,鼠标移入暂停
PHP一次请求生命周期
搜索模块用例编写
opencv 类的使用
m进制数str转n进制数
微信小程序开发








