Bash Script单引号内的双引号

时间:2019-04-08 19:12:37

标签: bash

是的,这有点混乱,但是我必须执行以下操作(这只是一个简化的示例):

import org.mockito.* import org.mockito.Mockito.`when` import org.mockito.Mockito.anyDouble class BasicReposTest { @get:Rule val activityRule = ActivityTestRule(MainActivity::class.java) @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule() @Mock lateinit var mockedDb : AppDatabase @Before fun setTheDatabase() { val context = ApplicationProvider.getApplicationContext<Context>() mockedDb = Room.inMemoryDatabaseBuilder( context, AppDatabase::class.java).build() } @Test fun doesReposRequestBounds() { `when`(mockedDb.momentDao().findMomentsByBound(ArgumentMatchers.anyDouble(), ArgumentMatchers.anyDouble(), anyDouble(), ArgumentMatchers.anyDouble())).thenReturn(momentList) //Request first set of moments repos.queryMapMoments(bounds, 20.toFloat()) //Do we get a list of moments sent to livedata? assertTrue(mappedMoments.value!!.size >= momentList.size) val list : List<Moment> = mappedMoments.value!! for (value in list) { System.out.println("D " + "RequestMomentsFromDatabaseByBoundsTest " + "MID = " + value.mId ) } }

我需要在单引号内的双引号内包含单引号。似乎标准的sudo -H -u user1 bash -c ‘ssh -I /home/user1/.ssh/id_rsa -f user2@machine1.domain1.com “find ./ -name ‘*.txt’”’不能正常工作,因为双打会关闭双打而不是引用单引号。可能是:'"'"'我在那里需要的每一个人吗?

我尝试跳过ssh命令中的"'"'""',但是当然失败了。

2 个答案:

答案 0 :(得分:2)

您不需要bash -c层;只需直接从ssh运行sudo即可。

sudo -H -u user1 ssh -I /home/user1/.ssh/id_rsa -f user2@machine1.domain1.com "find ./ -name \"*.txt\""

-I选项是不必要的;如果sshuser1的身份运行,则默认密钥为~user1/.ssh/id_rsa。您可能是说-i无论如何; -I指定要使用的PKCS#11库,而不是私钥。)

也就是说,您不能在单引号引起来的字符串中包含单引号。如有疑问,请使用双引号,并正确转义任何嵌套的双引号。

答案 1 :(得分:0)

chepner的答案就足够了。 如果需要bash -c,则可以使用这种看起来很杂乱的解决方案:

sudo -H -u user1 bash -c 'ssh -I /home/user1/.ssh/id_rsa -f user2@machine1.domain1.com "find ./ -name '"'"'*.txt'"'"'"'

解释

'... "find ./ -name '[first ' ended here]  "'" [second ' quote start]  '*.txt'[pattern]  "'"[second ' end] '"'[ " ended here]

我将替换为'